Вот более короткая версия:
fun test (_, []) = false
| test (i, x::xs) = (x = i) orelse test (i, xs)
Вот что я сделал:
Использовать сопоставление с образцом. В вашем втором решении вы уже сопоставляете шаблоны с пустым списком, так что это делает еще один шаг и сопоставляет шаблоны с непустым списком (x::xs
), что делает использование hd
и tl
ненужным.
Используйте шаблон _
, когда вам не нужно значение.
Вместо if P then true else Q
напишите P orelse Q
.
Скобка вокруг x = i
не обязательна. Это выглядит немного запутанным с двумя различными =
рядом друг с другом (один происходит из определения функции, а другой - двоичный оператор), но это также совершенно верно и означает то же самое:
fun test (_, []) = false
| test (i, x::xs) = x = i orelse test (i, xs)
Или отступ удобнее:
fun test (_, []) = false
| test (i, x::xs) =
x = i orelse test (i, xs)