在分配之前处理monad值

时间:2012-01-25 18:33:42

标签: haskell syntax

是否可以将这两行排成一行:

main = do line <- getLine 
    let result = words line

我的意思是非monadic代码

result = words getLine

- 在我看来 - 会提高可读性。

1 个答案:

答案 0 :(得分:14)

试试这个:result <- fmap words getLine

fmap使用a -> b类型的函数,并将其转换为f a -> f b,以用于Functor的实例,其中应该包括所有Monad个实例。

由于一些模糊的历史原因,有一个名为liftM的等效函数,该函数特定于Monad。在某些情况下,您可能需要使用它,但对于像IO这样的标准monad,您可以坚持使用fmap

您还可以导入Data.FunctorControl.Applicative以获得fmap的良好运营商版本,因此您可以改为编写words <$> getLine,这通常看起来更漂亮。