我有一个类型类A
,它有一个非内射的关联类型Context
class A a where
type Context a
字符串
所以A
的许多示例可以具有相同的Context
。A
的某些示例也是类AA
的示例,类AA
有两个额外的关联类型B
和C
。
class (A a) => AA a where
type B a
type C a
problematic :: Context a -> B a -> C a -> a
型
其意图是,给定一个Context
,B a
和C a
的组合唯一地标识a
,但我不知道如何表达这一点。
我知道有可能做出限制,
class A a where
type B a = b | b -> a
型
,但我需要的是某种带有多个参数的约束,比如(Context a, B a, C a) -> a
,这怎么能实现呢?
2条答案
按热度按时间6ioyuze21#
这个简洁的解决方案是由Edward Kmett在reddit上发布的。
字符串
q43xntqr2#
也许你可以退一双。我还没有测试过这个,但它看起来像这样:
字符串
您可能需要在其中添加某种签名,以便给予类型检查器一个提示;类型检查器的编译时级别版本倾向于比运行时级别版本更早地对其类型进行单态化。