在Haskell中写Zipwith

R. *_*nks 3 haskell

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

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

Prelude> zipWith (+) [10,20,30] [33,44,94]
[43,64,124]
Run Code Online (Sandbox Code Playgroud)

到目前为止我的代码是:

Zipwith f [] [] = []
Zipwith f [] _ = []
Zipwith f _ [] = []
Zipwith f (x:xs) (y:ys) = (f x y) : (Zipwith f xs ys)
Run Code Online (Sandbox Code Playgroud)

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

有什么想法吗?

ama*_*loy 11

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


J A*_*kin 9

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

PS

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

zipwith f (x:xs) (y:ys) = f x y : zipwith f xs ys
zipwith _ _ _ = []
Run Code Online (Sandbox Code Playgroud)

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