2013-10-08 134 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,它通常用於提供只讀配置值。