Для пустых списков, такие функции, как head
и tail
приведут к ошибке. Обратите внимание, что если вы напишите:
[h | (h:_) <- xss]
, тогда не эквивалентно map head xss
. Действительно, приведенное выше понимание списка эквивалентно:
let ok (h:_) = pure h
ok _ = fail "…"
in xss >>= ok
Так что в случае неудачного сопоставления с шаблоном мы возвращаем значение fail ""
. Для списка это пустой список:
Prelude> fail "" :: [Int]
[]
Это важно для непрямых angular списков, которые мы хотим транспонировать, например:
Prelude Data.List> transpose [[1,4,2,5],[1,3], [1,9,5,8]]
[[1,1,1],[4,3,9],[2,5],[5,8]]
Si это будет преобразуйте:
[ 1 4 2 5]
[ 1 3 ]
[ 1 9 5 8]
в:
[1 1 1]
[4 3 9]
[2 5]
[5 8]
Принимая во внимание, что если в конечном итоге использовать head
и tail
, в конечном итоге, когда он намеревается вычислить head
и tail
в третьем строка, она будет sh в списке [1,3]
:
Prelude Data.List> transpose' [[1,4,2,5],[1,3], [1,9,5,8]]
[[1,1,1],[4,3,9],[2,*** Exception: Prelude.head: empty list