My current approach to define a function of arbitrary arity is below, with A being an accumulator, E being the input argument type, and R being the result type.
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
But the minimum arity of foo is 1. The minimum for foo is still A -> E -> R, and doFoo is E -> R. I'd also like to have doFoo :: R. How?
What about
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)
?
You may want to have a look at the PrintfType instances. It's only because of them that I was able to provide an answer.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With