任何人都可以提供一个示例,显示在Haskell中添加两个数组吗?
我对Haskell相当陌生,而且我通常会发现,通过采用一种语言我能理解的简单方法,并了解其他程序员如何使用他们的语言,我可以更快地学习.
很高兴看到一些代码创建两个浮点数并调用一个函数,该函数生成一个带有求和值的数组.等同于以下C代码的东西.
void addTwoArrays(float *a, float *b, float *c, int len) {
int idx=0;
while (idx < len) {
c[idx] = a[idx] + b[idx];
}
}
int N = 4;
float *a = (float*)malloc(N * sizeof(float));
float *b = (float*)malloc(N * sizeof(float));
float *c = (float*)malloc(N * sizeof(float));
a[0]=0.0; a[1]=0.1; a[2]=0.2; a[3]=0.4;
b[0]=0.0; b[1]=0.1; b[2]=0.2; b[3]=0.4;
addTwoArrays(a,b,c,N);
Run Code Online (Sandbox Code Playgroud)
看到实现相同结果的Haskell代码将有助于我理解很多.我想haskell版本会创建结果数组并返回它,比如c = addTwoArrays(a,b,N)?
谢谢.
sep*_*p2k 10
为简单起见,我将使用(链接)列表而不是数组,因为使用列表文字可以更容易地创建它们.
a = [0, 0.1, 0.2, 0.4]
b = [0, 0.1, 0.2, 0.4]
c = zipWith (+) a b
Run Code Online (Sandbox Code Playgroud)
zipWith是一个函数,它接受另一个函数和两个列表,然后通过将给定函数应用于同一索引处的列表的每对元素来创建新列表.所以这里我们给出的函数zipWith是+,因此它添加了两个列表的元素.
如果我们想在不使用的情况下这样做,zipWith我们可以addTwoLists像这样定义:
addTwoLists [] _ = []
addTwoLists _ [] = []
addTwoLists (x:xs) (y:ys) = (x+y) : (addTwoLists xs ys)
Run Code Online (Sandbox Code Playgroud)
这里的逻辑是,当其中一个列表为空时,addTwoLists将返回一个空列表.否则,它将返回两个列表的头部之和(即a+b)前置于将它们的尾部相加的结果.
在haskell中,对于这个问题,你将使用列表而不是数组(但是数组,矢量存在于Haskell中,感谢Thomas M. DuBuisson的评论)并且代码将是这样的
addTwoArrays :: (Num a) => [a]->[a]->[a]
addTwoArrays _ [] = []
addTwoArrays [] _ = []
addTwoArrays (x:xs) (y:ys) = (x+y) : (addTwoArrays xs ys)
Run Code Online (Sandbox Code Playgroud)
此函数将采用具有数值(整数,浮点数等)的两个数组,并将它们相加,直到较短的长度.
但是我们可以使用功能语言功能编写相同的功能:
addTwoArrays :: (Num a) => [a]->[a]->[a]
addTwoArrays xs ys :: zipWith (+) xs ys
Run Code Online (Sandbox Code Playgroud)
这两个函数将采用两个列表并根据较短的值返回总和.
addTwoArrays [1.0, 2.0, 3.0] [2.0, 3.0, 4.0] --returns [3.0, 5.0, 7.0] and
addTwoArrays [1.0, 2.0, 3.0] [2.0, 3.0] --returns [3.0, 5.0]
Run Code Online (Sandbox Code Playgroud)