Как определить произвольную функцию арности в Haskell, которая включает арность 0?
Мой текущий подход к определению функции произвольной арности приведен ниже: 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. Как?
1 ответ
Решение
Как насчет
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. Только благодаря им я смог дать ответ.