任意のアリティの関数を定義するための現在のアプローチは次のとおりです。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も必要です。どうすればよいですか。