2011-07-17 62 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