3

私は3つの関連する型クラスを持っていることを表現したいと思います。

2つのファイルがあります。初め:

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
module ModA where

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

2番:

{-# 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

したがって、任意の1つのタイプのパラメーターを他のパラメーターから推測できます。しかし、あなたが本当にこれを望んでいるかどうかはわかりません。1つのfundepと1つのメソッドを持つ型クラスだけを持って、それの2つのインスタンス(instance Class A Binstance Class B C)を作ってみませんか?

于 2013-01-25T10:14:30.097 に答える
2

aGHCは、の呼び出しでファーストクラスパラメータのタイプを知ることができませんgetCb呼び出しはタイプがに修正され、機能依存性により、GHCはそれがである必要があるBと推測できます。しかし、に関する情報はありません。cCa

于 2013-01-25T09:49:33.410 に答える