3

有没有可能通过使用 Monads 在一行中重写它?

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

我无法理解如何传递输入,我的尝试会考虑 lambda 表示法。

4

2 回答 2

7

另一个地方fmap!用于fmap更改其他内容中的一个或多个值 - 在本例中为 inside getLine,但它更广泛有用。

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

or with import Data.Functororimport Control.Applicative你可以把它写成

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

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

fmap确实是一个非常有用的功能。您可以在关于 fmap的其他答案中阅读更多内容,我最终在其中编写了一个迷你教程。

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

于 2013-01-09T01:37:39.460 回答
4

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

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

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

于 2013-01-09T01:23:30.140 回答