我正在尝试在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的多个声明,但它只是一个参数,我认为参数有多个定义并不重要。
有什么想法吗?
答案 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
是某种数据类型,(实际上)实际上并不存在,这就是编译器混淆的原因。