在Haskell中具有功能依赖项的动机是什么?
功能依赖的一个示例:
class (Monad m) => MonadSupply s m | m -> s where
next :: m (Maybe s)
RWH书中指出,功能依赖性有助于类型检查器。它实际上有什么帮助?
另外,这段代码实际上可以编译:
class (Monad m) => MonadSupply s m where
next :: m (Maybe s)
但是我想这会产生运行时错误。
最佳答案
不使用功能依赖关系编写代码是完全可以的,因为推断很糟糕,因此使用起来很痛苦。
基本上没有FD,函数get :: MonadState m s => m s
将必须独立找出m
和s
。通常,m
很容易推断,但是s
通常需要显式注释。
而且,这比我们需要的要通用得多,因此我们可以将类型检查器限制为“对于m
,正好有1个s
”,这样,一旦推断出m
,s
对于类型推断算法而言就是显而易见的