2012-02-06 39 views
1

是否有可能?(有一个>>magic函数)来简化这个:这是Monad/Applicative Simplfication可能吗?

insertTransaction :: Day -> Int -> Int -> MyReaderT Bool 
insertTransaction day amount price = .... 

logTransaction :: Int -> Int -> MyReaderT Bool 
logTransaction amount price = do 
    day <- currentDay 
    insertTransaction day amount price 

要这样:

logTransaction :: Int -> Int -> MyReaderT Bool 
logTransaction = currentDay `>>magic` insertTransaction 

我觉得应该有一个运营商像>>magic,但我无法找到它。也不是<*>既不<$>

回答

6

没有类型特技的欺骗,这是不可能的,因为你试图用任意数量的参数“提升”一个函数 - 当然,这在Haskell中并不是一个明确定义的概念,因为钻营。

你很可能会在标准以获得最佳的,可读Haskell是这样的:

logTransaction :: Int -> Int -> MyReaderT Bool 
logTransaction amount price = join $ insertTransaction 
    <$> currentDay 
    <*> pure amount 
    <*> pure price 

我想这可能是罚款 - 建议的操作显得相当难读给我,因为这是很难说有多少参数正在处理或他们要去哪里。

随着Strathclyde Haskell Enhancement预处理,logTransaction可以写成如下,用idiom brackets

logTransaction :: Int -> Int -> MyReaderT Bool 
logTransaction amount price = (| insertTransaction currentDay ~amount ~price @ |) 

最后,技术上可以写在一个自由的点式logTransaction,但我不会推荐它:

logTransaction :: Int -> Int -> MyReaderT Bool 
logTransaction = ((currentDay >>=) .) . flip . flip insertTransaction 
8

如果您在第一时间写了insertTransaction,它可能是有意义的它重构为

insertTransaction :: Int -> Int -> Day -> MyReaderT Bool 
insertTransaction amount price day = .... 

然后,你可以说

logTransaction :: Int -> Int -> MyReaderT Bool 
logTransaction amount price = currentDay >>= insertTransaction amount price