Как я могу исправить эту программу, связанную с парами логических элементов в Haskell?

Для части домашнего задания в начале курса Haskell я пытаюсь написать программу, которая возьмет список пар Bools, и вернет список Bools, исходящий из пар bools с "&&" между ними. Например...

andandbool [(True,True),(True,False),(False,True),(False,False)]

вернется:

[True, False, False, False]

Однако я все время сталкиваюсь с проблемами. Мой код выглядит так.

andandbool :: [(Bool,Bool)] -> [Bool]
andandbool [a] = [fst x && snd x | x <- [a]]

Он отлично работает, когда я предоставляю список только одной пары, но сообщает "Неисчерпывающие шаблоны в функции andandbool", когда я ввожу список из нескольких пар. Есть ли какое-то понимание списка, которое мне не хватает? Любые указатели в правильном направлении были бы весьма полезны.

1 ответ

Теперь, когда я нахожусь на своем компьютере, я верну свой комментарий в ответ.

Когда вы называете аргумент функции [a], Haskell интерпретирует это как ваш шаблон функции, соответствующий в списке одного элемента. Вот почему ваша функция работала только над одноэлементными списками. Чтобы исправить это, просто переименуйте аргумент функции к чему-то без скобок в имени:

andandbool :: [(Bool,Bool)] -> [Bool]
andandbool as = [fst x && snd x | x <- as]

Это as аргумент теперь будет соответствовать любому списку.

Изменение: Как упоминалось в @Ankur, вы можете упростить это как:

andandbool as = [x && y | (x, y) <- as]

Если вы действительно хотите играть в гольф кода, вы можете упростить это еще больше:

andandbool = map (uncurry (&&))

licensed under cc by-sa 3.0 with attribution.