在页http://www.haskell.org/haskellwiki/Pointfree#Tool_support,它谈到了(->) a
单子。什么是Haskell`( - >)a` monad?
什么是这个monad?使用符号使得谷歌很难。
在页http://www.haskell.org/haskellwiki/Pointfree#Tool_support,它谈到了(->) a
单子。什么是Haskell`( - >)a` monad?
什么是这个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)
使用案例:您可以使用它来为代码提供配置文件。或者在某些类型的跳棋中,跟踪环境 – jozefg
它是功能单子,这是一个有点怪异理解。顺便说一下,它有时也被称为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
如果你尝试了这两个,你会看到你从双方得到的结果相同。那么究竟发生了什么?当你从一个函数中“提取”一个值时,你会得到可以被认为是它的“返回值”的东西。我在其中加了引号,因为当你从这个monad中得到一个值return
时,你返回的值是一个函数。
对于这样的示例,f2
的隐式参数作为隐式参数传递给每个<-
。如果您有许多具有相同参数的子表达式,它会非常有用。作为Reader monad,它通常用于提供只读配置值。
你可以称它为_function monad_的单词或_reader monad_(虽然通常指的是[明确命名的等价物](http://hackage.haskell.org/package/mtl-2.1.2/docs/Control -Monad-Reader.html))。 – leftaroundabout
http://learnyouahaskell.com/a-fistful-of-monads#the-monad-type-class – wit