【问题标题】:What is the Haskell `(->) a` monad?什么是 Haskell `(->) a` monad?
【发布时间】:2013-10-08 19:50:57
【问题描述】:

在页面http://www.haskell.org/haskellwiki/Pointfree#Tool_support,它谈到了(->) a monad。

这个单子是什么?符号的使用使 google 变得困难。

【问题讨论】:

标签: haskell monads


【解决方案1】:

这是一个 Reader monad。你可以把它想象成

type Reader r = (->) r -- Reader r a == (->) r a == r -> a
instance Monad (Reader r) where
  return a = const a            
  m >>= f = \r -> f (m r) r    

然后进行如下计算:

double :: Num r => Reader r r
double = do
  v <- id
  return (2*v)

【讨论】:

  • 用例:您可以使用它来提供带有配置文件的代码。或者在某些类型检查器中,跟踪环境
【解决方案2】:

就是函数monad,理解起来有点奇怪。顺便说一下,它有时也被称为 Reader monad。我认为说明它是如何工作的最好方法是通过一个例子:

f1 :: Double -> Double
f1 x = 10 * x + x ** 2 + 3 * x ** 3

f2 :: Double -> Double
f2 = do
    x1 <- (10 *)
    x2 <- (** 2)
    x3 <- (** 3)
    return $ x1 + x2 + 3 * x3

如果您尝试这两种方法,您会发现两者的输出相同。那么到底发生了什么?当你从一个函数中“提取”一个值时,你会得到可以被认为是它的“返回值”。我在它周围加上引号是因为当你 return 来自这个 monad 的值时,你返回的值是一个函数。

对于这样的示例,f2 的隐式参数作为隐式参数传递给每个 &lt;-。如果您有很多具有相同参数的子表达式,它会非常有用。作为 Reader monad,它通常用于提供只读配置值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2020-06-14
    • 2021-12-31
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2018-01-24
    相关资源
    最近更新 更多