2012-02-03 34 views
21

我想了解更多關於haskell的運營商->。我不是很清楚它是如何模糊特殊語法和某種類型類之間的界限,我想要做點什麼。例如,我已經看到這樣的事情:我在哪裏可以閱讀haskell「 - >」運算符?

instance Monad ((->) r) where ... 

這激起了我的興趣。但是,當我嘗試搜索「haskell箭頭」或「haskell函數」或「haskell類函數」時,我遇到了獲取Control.Arrow或簡單類型類教程結果的明顯問題。

什麼是->打來電話,我在哪裏可以閱讀更多關於它?

+2

注意:這應該是'實例Monad(( - >)r)'。 '( - >)'接受兩個類型參數,而'Monad'只接受一個類型,所以你需要首先部分應用它。 – hammar 2012-02-03 22:36:25

回答

27

(->)通常被稱爲「功能箭頭」或「功能型構造」,雖然它確實有一些特殊的語法,有沒有它太多特別之處。

它本質上是一箇中綴型操作符。給它兩種類型,它給你這些類型之間的函數類型。就像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 -> ...等相反的符號<-也出現在幾個不相關的上下文中。不要將這些與功能箭頭混淆。

+1

一如既往的很好的答案。然而,有人可能會爭論說,lambda表達式中的 - >與類型運算符有更多的關聯,而不是人們可能會想到的。當然'(\ a→b)c'是' - > b'的情況c,反之亦然。 – Ingo 2012-02-04 12:37:33

0

我認爲這是稱爲的箭頭。據「Real World Haskell」:

- >只有一個含義:它表示一個函數,它在左邊的類型的參數,並返回右邊的類型的值。

+1

這是在類型簽名,但OP的談論功能 – amindfv 2012-02-04 03:38:10

相關問題