【发布时间】:2015-08-03 23:16:57
【问题描述】:
我很难理解这个 Haskell 函数。我表面上知道它做了什么,但我不确定它是如何实现这个功能的。
zip (x:xs) (y:ys) = (x,y) : zip xs ys
zip xs ys = [ ]
我的想法:
-
zip是函数的名称。 -
zip有 2 个参数。 (我相信咖喱在这里并不重要)。 - 参数为
(x:xs)和(y:ys) -
zip返回元组类型(x,y)的列表。
现在对参数不太了解
(x:xs) (y:ys)
冒号在列表的开头附加一些东西(返回列表),那么为什么我们要在要压缩的列表中附加一些东西呢?函数定义中的x和y是什么?
右侧看起来很明显:我们将元组 (x,y) 插入 (0) 到 zip 返回的元组列表中。
(x,y) : zip xs ys
现在zip xs ys = [ ] 如果我们只传递 2 个列表,为什么我们总是想要一个空列表?
您能否解释一下对zip 的以下调用将如何进行评估:
zip [5,7,9] [1,3,5,11]
【问题讨论】:
-
您要了解左侧
:的关键字是“模式匹配”。这是一个递归定义,其中第二个等式(仅在第一个与参数不匹配时使用)是基本情况。与this question and its answers 比较(请注意,基本情况先出现,这也有效)。 -
谢谢,这也有帮助
-
澄清你的假设 1. - 4. 都是正确的,如果你对函数的类型有疑问,你可以启动 ghci 并输入
Prelude>:t zip来了解它的类型,这适用于任何函数,只要它在范围内,所以如果你有一个不在Prelude中的函数说splitOn你必须做Prelude> import Data.List.Split(这就是 splitOn 的来源)为了让它在范围内.对于运算符,您必须将它们包装在括号中Prelude> :t (/=). -
@JonasShinaniganz 如果您发现其中一个完整且准确,请记住接受答案。好问题!
标签: haskell