Есть три проблемы: одна - это сопоставление с шаблоном, одна - подпись типа, а другая - природа понимания списка. Вот исправленная версия:
{-# LANGUAGE ParallelListComp #-}
myzip :: [a] -> [b] -> [(a, b)]
myzip xs ys = [(x, y) | x <- xs | y <- ys]
- Исходная подпись типа,
[a] -> [a] -> [(a, a)]
, означала, что оба списка должны иметь элемент одного типа. Ord a
был лишним и означал, что определенные типы элементов были запрещены.
- Шаблон
[x, _] <- list1
означает, что каждый элемент list1
должен быть двухэлементным списком. Вместо этого используйте x <- list1
.
- Два понимания списка представлены последовательно, а не параллельно. Думайте о запятой как, «Возьмите элементы из списка 1, затем из списка 2» (серия). Представьте, что две трубы параллельны.
Разница между сериями и параллелями:
> [[x, y] | x <- "abc", y <- "123"] -- series
["a1","a2","a3","b1","b2","b3","c1","c2","c3"]
> [[x, y] | x <- "abc" | y <- "123"] -- parallel
["a1","b2","c3"]