Monads在haskell中传递变量

时间:2013-01-09 01:20:59

标签: haskell

有没有办法通过使用Monads在一行中重写这个?

input <- getLine
let parsed = reads input :: [(Int,String)]

我无法理解如何传递输入, 我的尝试是考虑lambda符号。

2 个答案:

答案 0 :(得分:7)

fmap的另一个地方!使用fmap更改其他内容的值 - 在这种情况下,在getLine内,但它更有用。

parsed <- fmap reads getLine :: IO [(Int,String)]

import Data.Functorimport Control.Applicative您可以将其写为

parsed <- reads <$> getLine :: IO [(Int,String)]

编译器很可能从其他地方推断出你的意思Int,在这种情况下你可以省略显式类型签名。

确实

fmap是一个非常有用的功能。你可以在other answer about fmap阅读更多内容,我最后写了一个迷你教程。

实际上,如果您对编写单行内容的方式感兴趣,那么您应该了解有关Applicative Functors的更多信息。

答案 1 :(得分:4)

当然,您可以使用liftM(或fmap,因为IO也有Functor个实例)将其放在一行上,

parsed <- (reads :: ReadS Int) `liftM` getLine

但我认为这很少会增加可读性。