haskell 如何指定一个具有多参数内射性的类型族?

6ju8rftf  于 6个月前  发布在  其他
关注(0)|答案(2)|浏览(61)

我有一个类型类A,它有一个非内射的关联类型Context

class A a where
   type Context a

字符串
所以A的许多示例可以具有相同的Context
A的某些示例也是类AA的示例,类AA有两个额外的关联类型BC

class (A a) => AA a where
   type B a
   type C a
   problematic :: Context a -> B a -> C a -> a


其意图是,给定一个ContextB aC a的组合唯一地标识a,但我不知道如何表达这一点。
我知道有可能做出限制,

class A a where
   type B a = b | b -> a


,但我需要的是某种带有多个参数的约束,比如(Context a, B a, C a) -> a,这怎么能实现呢?

6ioyuze2

6ioyuze21#

这个简洁的解决方案是由Edward Kmett在reddit上发布的。

class A a where
  type Context a

class (A a, Context a ~ ctx, B a ~ b, C a ~ b,) => AA' a ctx b c | a -> ctx b c, ctx b c -> a where
  type B a 
  type C a

type AA a = AA' a (Context a) (B a) (C a)

字符串

q43xntqr

q43xntqr2#

也许你可以退一双。我还没有测试过这个,但它看起来像这样:

type family Fst a where Fst '(a, b) = a
type family Snd a where Snd '(a, b) = b
type B a = Fst (BC a)
type C a = Snd (BC a)

class A a => AA a where
    type BC a = b | b -> a

字符串
您可能需要在其中添加某种签名,以便给予类型检查器一个提示;类型检查器的编译时级别版本倾向于比运行时级别版本更早地对其类型进行单态化。

相关问题