Как определить произвольную функцию арности в Haskell, которая включает арность 0? - PullRequest
9 голосов
/ 11 июля 2011

Мой текущий подход к определению функции произвольной арности приведен ниже, где 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 Ответ

10 голосов
/ 11 июля 2011

А как же

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 . Только благодаря им я смог дать ответ.

...