You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何等价类型类定义在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 18:54:10