Лямбда-исчисление isEven-функция в Haskell - PullRequest
0 голосов
/ 04 апреля 2019

Итак, я изучаю лямбда-исчисление в Haskell и пытаюсь реализовать функцию isEven, которая возвращает true, если она четная, и false в противном случае. Я знаю, что 0 является четным, а затем 1 является нечетным, и тогда каждое чередующееся число является альтернативой предшествующего, то есть, если один нечетный, то 2 является четным, тогда 3 является нечетным. Могу ли я иметь функцию isEven, проверяющую, является ли вход 0, а если нет, то каким-то образом проверить, является ли его преемник четным или нечетным?

1 Ответ

2 голосов
/ 04 апреля 2019

Я предполагаю, что под "лямбда-исчислением" вы имеете в виду, что мы работаем с некоторыми закодированными Церковью цифрами + логическими значениями, и часть "Хаскеля" в основном случайна для вашего вопроса.

isEven = \n -> n flip True
flip = \x y z -> x z y
True = \x y -> x
False = \x y -> y

Это немного отличается от того, как вы это выражаете.

Вспомните церковную цифру n означает n повторных функций приложения. flip повторяется четное число раз id, таким образом n flip == id для четного n, n flip == flip для нечетного n. Также flip True == False и flip False == True. Таким образом, конструкция правильно кодирует четность.

...