在 Haskell 中将 zip 与 zipWith 结合使用

问题描述 投票:0回答:1

我目前正在学习 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)]

我错过了什么?

haskell zipwith
1个回答
0
投票

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)]

会将两个列表压缩在一起。

© www.soinside.com 2019 - 2024. All rights reserved.