Часть (x:xs) == []
не является бессмысленной: с (x:xs)
you создается список, содержащий хотя бы один элемент: x
в качестве первого элемента и xs
в качестве (возможно, пустого)список оставшихся элементов.Следовательно, всегда приведет к False
.
. Суть шаблона (x:xs)
состоит в том, что он соответствует непустым спискам .Список определяется как:
data [a] = [] | (a:[a]) -- pseudo-code
Таким образом, список имеет два конструктора данных:
- пустой список
[]
;и - "минусы"
(x:xs)
, имеющие голову x
и хвост xs
.x
- это элемент списка, а xs
- список оставшихся элементов.
Вы можете проверить, равен ли xs
весь список пустому списку, изатем используйте head
и tail
:
product' :: [Integer] -> Integer
product' xs
| xs == [] = 1
| otherwise = head x * product' (tail xs)
Но вышеприведенное не очень элегантно, поскольку head
и tail
являются неполными функциями (хорошо, что они ошибочныдля пустых списков), таким образом, «сложнее» определить, что эта функция всегда будет давать ответ.