在Haskell中写Zipwith

时间:2016-02-23 21:41:55

标签: haskell

我正在尝试在Haskell中编写Zipwith函数。

如果我使用以下值运行它,它应返回此结果:

Prelude> zipWith (+) [10,20,30] [33,44,94]
[43,64,124]

到目前为止我的代码是:

Zipwith f [] [] = []
Zipwith f [] _ = []
Zipwith f _ [] = []
Zipwith f (x:xs) (y:ys) = (f x y) : (Zipwith f xs ys)

然而,编译器告诉我,我有多个函数,都是Zipwith,没有数据定义,但我认为在Haskell中没有必要的函数。 另外,它说我有f的多个声明,但它只是一个参数,我认为参数有多个定义并不重要。

有什么想法吗?

3 个答案:

答案 0 :(得分:10)

函数名称必须以小写字母(或符号)开头。大写字母保留用于新数据类型。如果它的名称为zipWith,那么您的定义将完全正确。

答案 1 :(得分:8)

Haskell函数 必须 以小写字母开头。大写名称保留用于其他内容,例如数据类型。在这种情况下,最好为函数zipWith'命名,因为'通常用于表示函数几乎相同,但变化很小。

P.S。

对您的代码的小批评:您可以删除行zipwith f [] [] = [],因为其他行已经捕获了这种情况。如果你愿意,你甚至可以这样写:

zipwith f (x:xs) (y:ys) = f x y : zipwith f xs ys
zipwith _ _ _ = []

因为第一个是你唯一关心的模式。

答案 2 :(得分:4)

回显其他答案:函数名必须以小写字母开头。这不仅仅是一种编码惯例;它是实际语言语法的一部分。如果你不这样做,它实际上会停止编译。

其他编程语言通常都有关于如何使用case的约定,但Haskell编译器实际上使用它来决定你所指的是什么类型的名称。在这种情况下,它认为Zipwith是某种数据类型,(实际上)实际上并不存在,这就是编译器混淆的原因。