Таблицы истинности анонимных функций в Haskell

Я пытаюсь сгенерировать таблицу истинности для заданного логического выражения. Я мог бы сделать это, создав новый Datatype BoolExpr, но я хочу сделать это с помощью анонимной функции. Это должно работать так:

> tTable (\x y -> not (x || y))
output:
F F | T
F T | F
T F | F
T T | F

Мой подход:

tbl p = [(uncurry p) tuple | tuple <- allval]
        where allval=[(x,y) | x <- [False,True], y <- [False,True]]

Это работает, но только для 2 аргументов. Я хочу сделать это для любого количества аргументов. Поэтому я решил создать функцию, которая берет аргументы из списка:

argsFromList f []     = f
argsFromList f (x:xs) = argsFromList (f x) xs

Это не работает:

 Occurs check: cannot construct the infinite type: t = t1 -> t
   Expected type: t -> [t1] -> t1 -> t
   Inferred type: (t1 -> t) -> [t1] -> t1 -> t
 In the expression: argsFromList (f x) xs

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

7
задан Brian Tompsett - 汤莱恩 17 February 2017 в 19:11
поделиться