Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
search f | f possibleMatch = Just possibleMatch
possibleMatch :: Maybe Nat
f possibleMatch
не написатьtest = a*a == 15
where
a = lyingSearch (\x -> x*x == 15)
(\x -> x*x == 15)
не выполняется ни для какого x
, следовательно a
здесь будет равно бесконечности (т.е. бесконечной последовательности Succ (Succ (Succ (...
). При умножении такого значения само на себя по определённым для Nat
правилам умножения будет лениво получаться такая же последовательность (что логично: inf*inf = inf
). Оператор сравнения ==
также ленивый, и после того как он раскроет 15 вложенных Succ
с обеих сторон, слева будет ещё Succ
, а справа Zero
— они, очевидно, не равны :)inf = Succ inf
. Если в вашем коде вместо a = lyingSearch (\x -> x*x == 15)
написать теперь a = inf
, результат будет таким же (False
).Всю теорию из этого поста можно пересказать в одном предложении: «на компактных функциях можно определить оператор равенства».
Я полагаю, что полезно отделять вещи, неприменимые в промышленности сегодня — и вещи, неприменимые нигде, даже в самой экзотической теории. Это не одно и то же.
что же всё-таки вы хотите здесь показать
но и в том, что вообще непонятно, что получилось.
Для некоторых функций search работает, для других нет. Для каких? Это в статье не сказано.
f
, которая всегда завершается, функция search
также будет завершаться — т.е. она работает. Никаких других условий на f
не накладывается. Другие же функции f
(т.е. те, которые не завершаются) не вижу смысла здесь рассматривать.(Nat -> Bool) -> Maybe Nat
.f(x)==c
. Для такого класса функций существует алгоритм, использующий эти параметры c, который позволяет за менее-чем-линейное время с постоянной памятью найти ответ. Однако какой тогда должна быть сигнатура функции?(Nat -> Bool) -> Maybe Nat
, который бы использовал один из этих целевых алгоритмов, потому что такой решатель не будет иметь информации о «скрытых параметрах» функции.
Haskell — невозможное возможно?