我目前正在学习 Haskell,我遇到了以下难题。下面的结构有什么问题吗?:
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)]
我错过了什么?
zip
不是一个组合两个非列表元素的有意义的函数。事实上, zip
的类型为 zip :: [a] -> [b] -> [(a, b)]
[Hackage]。因此,它需要两个列表并使用这些列表创建2元组。
这意味着如果我们有一个
列表列表,
zipWith
将与zip
一起使用:
zipWith zip [[1],[2,3]] [[4],[5, 6]] -- [[(1,4)], [(2, 5), (3, 6)]]
这里,外部
zipWith
会压缩外部结构,zip
将在 zip [1] [4]
和 zip [2, 3] [5, 6]
上调用,分别生成 [(1, 4)]
和 [(2, 5), (3, 6)]
。
zip
是以下内容的快捷方式:
zip = zipWith (,)
确实,
(,) :: a -> b -> (a, b)
是一个数据构造函数,因此也是一个接受两个元素并生成这两个元素的2元组的函数,因此:
zipWith (,) [1, 2, 3] [4, 5, 6] -- [(1, 4), (2, 5), (3, 6)]
会将两个列表压缩在一起。