什么是Haskell`( - >)a` monad?

时间:2013-10-08 19:50:58

标签: haskell monads

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

这个monad是什么?使用符号使谷歌很难。

2 个答案:

答案 0 :(得分:4)

这是一个读者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)

答案 1 :(得分:4)

这是函数monad,理解起来有点奇怪。顺便说一句,它有时也被称为读者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的隐式参数作为隐式参数传递给每个<-。如果你有很多具有相同参数的子表达式,那么它会非常有用。作为Reader monad,它通常用于提供只读配置值。