Я пытаюсь создать функцию, которая получает вариативную функцию как аргумент , т.е.
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).