2011-07-17 63 views
4

可能重複:
What's the 「|」 for in a Haskell class definition?MonadState的語法類型類聲明

我是很新,哈斯克爾。在documentation of MonadState我看到以下內容:

class Monad m => MonadState s m | m -> s where 
    get :: m s 
    put :: s -> m() 

什麼是| m -> s語法嗎?

+0

事實確實如此。搜索SO時我沒有發現這個問題。很難搜索「|」字符,當你不知道它叫什麼:) – jchl

+0

確實如此。順便說一句,這需要一個語言擴展,如果您嘗試編譯這樣一個沒有任何編譯器標誌的定義,GHC會說'類'C'中的Fundeps(使用-XFunctionalDependencies以允許fundeps)''。模塊文檔還指定了所需的擴展名。要了解如何搜索,請記住一些事項。 :] –

回答

6

它被稱爲函數依賴關係或簡稱fundep。語法

class Monad m => MonadState s m | m -> s where 

手段,僅存在一個用於每個m或實例 - 換句話說,如果m是已知的,該編譯器可以推斷的s形式的類型。使用fundeps使編碼變得更容易,因爲編譯器可以推斷更多。

+1

感謝您的快速和簡潔的答案。我搜索了「Haskell函數依賴」,現在正忙於閱讀http://www.haskell.org/haskellwiki/Functional_dependencies,希望能夠詳細闡述! – jchl