В качестве упражнения я пытаюсь реализовать интересные части прелюдии вручную. Всякий раз, когда я вижу возможность пойти бесплатно, я использую ее. Однако это привело меня к кирпичной стене в самом неожиданном месте. Используя этот код:
myelem _ [] = False
myelem x y = if x == head y then True else myelem x (tail y)
Я пытаюсь реализовать notElem
. Вот мои попытки:
-- First
mynotelem = not myelem
Понятно, что взрывается из-за несовпадения типов. Это легко исправить:
-- Second
mynotelem x y = not (myelem x y)
Однако явное объявление аргументов x и y кажется уродливым и ненужным, поэтому я пытаюсь вернуть его к бесточечному стилю.
-- Third
mynotelem = not $ myelem
Что терпит неудачу с
Couldn't match expected type `Bool'
with actual type `a0 -> [a0] -> Bool'
In the second argument of `($)', namely `myelem'
In the expression: not $ myelem
In an equation for `mynotelem': mynotelem = not $ myelem
Достаточно справедливо, типы все еще не совпадают. Но как это исправить? Опять же, вы можете перейти прямо к
-- Fourth
mynotelem x y = not $ myelem x y
Что работает, но кажется опасно близким к тому, чтобы просто ходить по кругу. Я обнаружил, что можно исключить один из аргументов:
-- Fifth
mynotelem x = not . (myelem x)
Но этот надоедливый x все еще остается. Как мне это устранить?
($)
и(.)
— я думаю, вы найдете эти вопросы/ответы полезными. - person Thomas M. DuBuisson   schedule 28.12.2011