(->)
通常被稱爲「功能箭頭」或「功能型構造」,雖然它確實有一些特殊的語法,有沒有是它太多特別之處。
它本質上是一箇中綴型操作符。給它兩種類型,它給你這些類型之間的函數類型。就像2 + 3
是(+) 2 3
的語法糖,from -> to
也是(->) from to
的語法糖。如果符號很混亂,你可以把它想象成Function from to
。
換句話說,你所提到的情況下,可以理解爲
instance Monad (Function from) where ...
這清楚地表明,我們正在談論這需要一些任意的(但固定)參數類型的函數。實際上,這個monad實例在Control.Monad.Instances中找到,它基本上與the Reader monad相同。
看着the source,它真的很簡單:
instance Monad ((->) r) where
return = const
f >>= k = \ r -> k (f r) r
通過return
給出的瑣碎值忽視的說法,和(>>=)
運營商的說法r
分配到兩側。
值得注意的是,在相應的Applicative
函數實例中,pure
和(<*>)
對應於the SKI combinator calculus的K和S組合器。
(->)
也由Arrow type class一概而論。對箭頭can be found here的介紹。
最後,請注意,符號->
也出現在語法的其他或多或少不相關的部分,包括lambda抽象\x -> ...
,案例表達式case ... of x -> ...
等相反的符號<-
也出現在幾個不相關的上下文中。不要將這些與功能箭頭混淆。
注意:這應該是'實例Monad(( - >)r)'。 '( - >)'接受兩個類型參數,而'Monad'只接受一個類型,所以你需要首先部分應用它。 – hammar 2012-02-03 22:36:25