在http://www.haskell.org/haskellwiki/Pointfree#Tool_support页面上,它谈到了(->) a
monad。
这是什么单子?符号的使用使搜索变得困难。
在http://www.haskell.org/haskellwiki/Pointfree#Tool_support页面上,它谈到了(->) a
monad。
这是什么单子?符号的使用使搜索变得困难。
就是函数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
传递给每个<-
。如果您有很多具有相同参数的子表达式,它会非常有用。作为 Reader monad,它通常用于提供只读配置值。
这是一个 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)