【发布时间】:2015-05-08 12:35:40
【问题描述】:
例如,当我有一个 Maybe 值时,我想在它是 Just 时应用一些东西,或者如果它是 Nothing,就保留一个 Nothing,我有很多方法可以实现它在哈斯克尔。但是,当我想对其应用一元动作时,我没有找到一种简洁的方法。
在这段代码中,要获得d,我可以使用fmap。但我不能用它来获取c,因为它需要一个单子(在这种情况下为IO)操作才能应用于Maybe 中的值。
import Control.Applicative
main = do
let x = Just "test.txt"
let d = reverse <$> x -- good
print d
c <- case x of -- verbose
Nothing -> return Nothing
Just y -> Just <$> readFile y
print c
这是一种可以做到的方式,但也太冗长了。
c' <- maybe (return Nothing) (\a -> Just <$> readFile a) x
print c'
我确定有更短的方法,我现在看不到它......
【问题讨论】:
-
似乎您想组合两个单子(在您的情况下,
Maybe和IO)。这通常使用 monad 转换器 (book.realworldhaskell.org/read/monad-transformers.html) 完成。有一个现有的MaybeTmonad 转换器,它应该会有所帮助(hackage.haskell.org/package/transformers-0.3.0.0/docs/…) -
我知道 monad 转换器,但对于简单的一次性情况,我认为这将是矫枉过正。案例会更短,更易读。
标签: haskell