Я пытаюсь создать таблицу истинности для данного логического выражения. Я мог бы сделать это, создав новый тип данных 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
Я не понимаю, в чем здесь проблема. Я был бы очень признателен, если бы кто-нибудь мог указать мне правильное направление или опубликовать ссылку, которая делает.
(\[x,y] -> not (x || y))
, что автоматически даст вам поведение функции с произвольным количеством аргументов одного типа. - person leftaroundabout   schedule 13.12.2011