3

我想表达我有 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")

我错过了什么?

4

2 回答 2

6

您可以使功能依赖“循环”:

class Class a b c | a->b, b->c, c->a where
    getB :: a -> b
    getC :: b -> c

所以任何一个类型参数都可以从其他任何一个类型参数中推导出来。但我不确定你是否真的想要这个;为什么不只拥有一个具有一个fundep 和一个方法的类型类,并创建它的两个实例(instance Class A Binstance Class B C)?

于 2013-01-25T10:14:30.097 回答
2

GHC 无法知道a. getC调用固定b为 type B,然后函数依赖允许 GHC 推断出c必须是C. 但没有a可用的信息。

于 2013-01-25T09:49:33.410 回答