【问题标题】:Monads passing variable in haskell在haskell中传递变量的Monads
【发布时间】:2013-01-09 01:20:59
【问题描述】:

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

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

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

【问题讨论】:

    标签: haskell


    【解决方案1】:

    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 的更多信息。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 感谢@sinelaw,让链接地址变得更短。
      • ...和来自Control.ApplicativeliftA 是一回事,来自同一模块的&lt;$&gt; 运算符也是如此。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 2018-12-07
      相关资源
      最近更新 更多