2011-07-11 8 views
9

Moje obecne podejście do definiowania funkcji arbitralnego arity znajduje się poniżej, gdzie A jest akumulatorem, E jest rodzajem argumentu wejściowego, a R jest typem wyniku.Jak zdefiniować dowolną funkcję arain w Haskell, która zawiera arity 0?

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 

Ale minimalna arity foo to 1. Minimalna dla foo jest nadal -> E -> R, a doFoo jest E -> R. Chciałbym również mieć doFoo :: R. W jaki sposób?

Odpowiedz

10

Co

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) 

?

Możesz chcieć rzucić okiem na instancje PrintfType. To tylko dzięki nim mogłem udzielić odpowiedzi.

+0

Hmm ... Czuję się teraz głupio! Jak usunąć pytanie SO? –

+5

Ty nie. To pytanie może być przydatne dla innych osób. – hammar

+1

Kolejny przydatny pakiet do obejrzenia to szybkie sprawdzenie. Zapewnia także funkcje z argumentami variadic. – Masse

Powiązane problemy