为何等价类型类定义在Haskell覆盖条件失败而PureScript编译正常?
问题解决方法
你遇到的报错是GHC默认的保守实例检查规则导致的,PureScript的类型系统对函数依赖的实例检查规则更宽松,所以同逻辑代码能直接编译通过,Haskell只需开启对应语言扩展即可正常运行。
调整方案
首先在代码头部添加三个语言扩展编译指示,原有逻辑不需要任何修改即可编译通过:
{-# LANGUAGE FunctionalDependencies #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE UndecidableInstances #-} class Foo a b c | a b -> c where newtype Bar a b = Bar (a, b) instance (Foo a c e, Foo b d f) => Foo (Bar a b) (Bar c d) (Bar e f) where
原理解释
FunctionalDependencies:使用类型类函数依赖特性的必需扩展。FlexibleInstances:允许类型类实例的参数使用自定义复合类型(如代码里的Bar a b),突破Haskell98的严格实例格式限制。UndecidableInstances:你报错的核心原因是GHC默认不会递归通过实例约束的函数依赖来推导实例头变量的确定性,该扩展放宽了这个检查限制,允许GHC从约束Foo a c e和Foo b d f的函数依赖推导出e和f是由实例头前两个参数Bar a b、Bar c d唯一确定的,你的场景下开启这个扩展是完全安全的,不会导致类型检查不终止。
内容的提问来源于stack exchange,提问作者tom
相关产品推荐
相关产品推荐

