С этим определением:
member _ [] = False
member x (h:t) = if x == h then True else member x t
PAKCS 2.0.1 (из Ubuntu 18.04) не дает ответов, предупреждений или ошибок:
Top-level binding with no type signature:
member :: Prelude.Eq a => a -> [a] -> Prelude.Bool
member> member x [1, 2, 3] =:= True where x free
member>
Я ожидал увидеть 3 значения. Что я здесь делаю неправильно?
member
с унифицирующим=:=
вместо не унифицирующего==
была бы неправильной: для оценки термаif then else
сначала нужно было бы оценитьx =:= h
путем поиска решения. Если он успешно объединяетx
сh
, этот термин имеет значение (всегдаTrue
), и оценка переходит кif then else
. В противном случае, если решений нет, то и все выражение (вся функция) не имеет решений. Частьelse
никогда не будет оцениваться и давать результат. - person imz -- Ivan Zakharyaschev   schedule 29.12.2020