在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将必须独立找出ms。通常,m很容易推断,但是s通常需要显式注释。

而且,这比我们需要的要通用得多,因此我们可以将类型检查器限制为“对于m,正好有1个s”,这样,一旦推断出ms对于类型推断算法而言就是显而易见的

10-07 14:26