我目前正在学习 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
有类型[Hackage]。因此,它需要两个列表并使用这些列表创建 2 元组。zip :: [a] -> [b] -> [(a, b)]
这意味着如果我们有一个列表列表,
zipWith
则可以使用as 函数:zip
这里,外部
zipWith
因此拉链外部结构,并且zip
将被调用zip [1] [4]
并分别zip [2, 3] [5, 6]
产生[(1, 4)]
和[(2, 5), (3, 6)]
。zip
是一个快捷方式:实际上,
(,) :: a -> b -> (a, b)
是一个数据构造函数,因此也是一个接受两个元素并生成这两个元素的 2 元组的函数,因此:会将两个列表压缩在一起。