我想表达我有3个相关的类型类。
我有两个文件。第一:
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
module ModA where
class Class a b c | a -> b, b -> c where
getB :: a -> b
getC :: b -> c
第二
{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
module B where
import qualified ModA
data A = A {f1::String}
data B = B {f2::String}
data C = C {f3::String}
instance ModA.Class A B C where
getB a = B "hey"
getC a = C "ho"
getABForMe = ModA.getB (A "boo")
getACForMe = ModA.getC (B "yo")
我得到的错误:
No instance for (ModA.Class a0 B C)
arising from a use of `ModA.getC'
Possible fix: add an instance declaration for (ModA.Class a0 B C)
In the expression: ModA.getC (B "yo")
In an equation for `getACForMe': getACForMe = ModA.getC (B "yo")
我错过了什么?
答案 0 :(得分:6)
您可以将功能依赖性设为“循环”:
class Class a b c | a->b, b->c, c->a where
getB :: a -> b
getC :: b -> c
所以任何一个类型参数都可以从任何其他参数推导出来。但我不确定你是否真的想要这个;为什么不只有一个带有一个fundep和一个方法的类型类,并创建它的两个实例(instance Class A B
和instance Class B C
)?
答案 1 :(得分:2)
GHC无法知道a
调用中第一类参数getC
的类型。调用将b
修复为B
类型,然后函数依赖项允许GHC推断c
必须为C
。但是没有关于a
的信息。