在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)
但我想,它会产生运行时错误。
答案 0 :(得分:8)
编写不使用函数依赖的代码是完全没问题的,因为推理很糟糕,所以使用起来很麻烦。
基本上没有FD,函数get :: MonadState m s => m s
必须独立地找出m
和s
。通常m
非常容易推断,但s
通常需要明确的注释。
此外,这比我们需要的要广泛得多,所以我们可以限制我们的类型检查器说“For m
,恰好有1 s
”,这样一次{{1}推断,m
对于类型推断算法是显而易见的