Atualmente estou aprendendo Haskell e estou preso ao seguinte enigma. O que há de errado com a seguinte construção?:
zip [1,2,3] [4,5,6]
Result: [(1,4),(2,5),(3,6)]
zipWith (+) [1,2,3] [4,5,6]
Result: [5,7,9]
zipWith (zip) [1,2,3] [4,5,6]
OR
zipWith zip [1,2,3] [4,5,6]
Result: <interactive>:22:1: error:
• No instance for (Num [()]) arising from a use of ‘it’
• In the first argument of ‘print’, namely ‘it’
In a stmt of an interactive GHCi command: print it
Expected Result: [(1,4),(2,5),(3,6)]
o que estou perdendo?
resumindo :
zip
é aplicado aos elementos das listas, não às listas inteiras.zip
não é uma função sensata combinar dois elementos que não são listas. Na verdade,zip
tem o tipo [Hackage] . Portanto, são necessárias duas listas e cria 2 tuplas com essas listas.zip :: [a] -> [b] -> [(a, b)]
Isso significa que
zipWith
funcionarázip
como função se tivermos uma lista de listas :aqui o externo
zipWith
fecha as estruturas externas ezip
será chamadozip [1] [4]
ezip [2, 3] [5, 6]
para produzir[(1, 4)]
e[(2, 5), (3, 6)]
respectivamente.zip
é um atalho para:na verdade,
(,) :: a -> b -> (a, b)
é um construtor de dados e, portanto, também uma função que recebe dois elementos e produz uma tupla dupla desses dois elementos, então:compactará as duas listas juntas.