10

任意のアリティの関数を定義するための現在のアプローチは次のとおりです。Aはアキュムレータ、Eは入力引数タイプ、Rは結果タイプです。

combine :: A -> E -> A

class X r where
    foo :: A -> E -> r

instance X R where
    foo :: A -> E -> R


instance X r => X ( E -> r ) where
    foo :: A -> E -> E -> r
    foo ( a :: A ) ( x :: E ) =
        foo ( a `combine` e :: A )

doFoo = foo emptyA

ただし、fooの最小アリティは1です。fooの最小値はA-> E-> Rであり、doFooはE->Rです。doFoo::Rも必要です。どうすればよいですか。

4

1 に答える 1

10

どうですか

class X r where
    foo :: A -> r

instance X r => X (E -> r) where
    foo :: A -> E -> r
    foo a e = foo (combine a e)

PrintfTypeインスタンスを確認することをお勧めします。私が答えることができたのは彼らのおかげです。

于 2011-07-11T05:05:08.167 に答える