Как написать функцию Haskell, которая принимает в качестве аргумента функцию с переменным числом аргументов

Я пытаюсь создать функцию, которая получает вариативную функцию как аргумент , т.е.

func :: (a -> ... -> a) -> a

как я могу это сделать?

Я читал о поливариадических функциях и уверен, что Олег уже сделал это , однако я теряюсь, пытаясь применить шаблон к функции с вариативной функцией как аргумент. Особенно подход Олега, похоже, работает только с расширениями Glasgow, и я хочу, чтобы решение работало в чистом Haskell 98 (как Text.Printf ).

Причина , о которой я спрашиваю, заключается в том, что я пытаюсь создать функцию, которая принимает в качестве аргумента логическую функцию и проверяет, является ли она тавтологией, т.е.

isTautology :: (Bool -> ... -> Bool) -> Bool

, чтобы можно было ввести:

isTautology (\x -> x && not x)
isTautology (\x y -> x && y || not y)

Моя проблема в том, что я продолжаю читать о том, что уловка заключалась в том, чтобы сделать тип возвращаемого значения переменной типа (чтобы он мог быть результатом или другой функцией), но мой тип возвращаемого значения является фиксированным (Bool).

43
задан Community 23 May 2017 в 11:45
поделиться