Да.Когда вы квалифицируете понимание списка путем сопоставления с образцом, значения, которые не совпадают, отфильтровываются, избавляясь от пустого списка в вашем Примере 1. В Примере 3 пустой список соответствует шаблону xs
, поэтому не фильтруется,тогда head xs
терпит неудачу.Точка сопоставления с образцом - это безопасное сочетание различения конструкторов и выбора компонентов!
Вы можете добиться того же сомнительного эффекта с шаблоном неопровержимый , лениво выполняя выбор без различения.
Prelude> [x|(~(x:_))<-["hi","hello",""]]
"hh*** Exception: <interactive>:1:0-30: Irrefutable pattern failed for pattern (x : _)
Список пониманий аккуратно использует пакет map
, concat
и, следовательно, filter
.