2013-10-08 52 views
3

在页http://www.haskell.org/haskellwiki/Pointfree#Tool_support,它谈到了(->) a单子。什么是Haskell`( - >)a` monad?

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

+1

你可以称它为_function monad_的单词或_reader monad_(虽然通常指的是[明确命名的等价物](http://hackage.haskell.org/package/mtl-2.1.2/docs/Control -Monad-Reader.html))。 – leftaroundabout

+0

http://learnyouahaskell.com/a-fistful-of-monads#the-monad-type-class – wit

回答

4

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

使用案例:您可以使用它来为代码提供配置文件。或者在某些类型的跳棋中,跟踪环境 – jozefg

4

它是功能单子,这是一个有点怪异理解。顺便说一下,它有时也被称为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,它通常用于提供只读配置值。