在http://www.haskell.org/haskellwiki/Pointfree#Tool_support页面,它讨论了(->) a
monad。
这个monad是什么?使用符号使谷歌很难。
答案 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,它通常用于提供只读配置值。