有人能举例说明在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);
看到实现相同结果的Haskell代码将有助于我理解很多。我想haskell版本会创建结果数组并返回它,比如c = addTwoArrays(a,b,N)?
感谢。
答案 0 :(得分:10)
为了简单起见,我将使用(链接)列表而不是数组,因为使用列表文字可以更容易地创建它们。
a = [0, 0.1, 0.2, 0.4]
b = [0, 0.1, 0.2, 0.4]
c = zipWith (+) a b
zipWith
是一个函数,它接受另一个函数和两个列表,然后通过将给定函数应用于同一索引处的列表的每对元素来创建新列表。所以我们在zipWith
给出的函数是+
,因此它添加了两个列表的元素。
如果我们想在不使用zipWith
的情况下执行此操作,我们可以像这样定义addTwoLists
:
addTwoLists [] _ = []
addTwoLists _ [] = []
addTwoLists (x:xs) (y:ys) = (x+y) : (addTwoLists xs ys)
这里的逻辑是,当其中一个列表为空时,addTwoLists将返回一个空列表。否则,它将返回两个列表的头部之和(即a+b
)前置于将尾部相加的结果。
答案 1 :(得分:5)
在haskell中,对于这个问题,你将使用列表而不是数组(但是数组,矢量存在于Haskell中,感谢Thomas M. DuBuisson的评论)并且代码将是这样的
addTwoArrays :: (Num a) => [a]->[a]->[a]
addTwoArrays _ [] = []
addTwoArrays [] _ = []
addTwoArrays (x:xs) (y:ys) = (x+y) : (addTwoArrays xs ys)
此函数将采用两个具有数值(整数,浮点数等)的数组,并将它们相加,直到较短的数组。
但是我们可以使用函数式语言功能编写相同的函数:
addTwoArrays :: (Num a) => [a]->[a]->[a]
addTwoArrays xs ys :: zipWith (+) xs ys
这两个函数将采用两个列表并根据较短的值返回总和。
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]
答案 2 :(得分:4)
除了其他答案:Vector s也存在拉链功能。向量是真实数组而不是链表,尽管如果可能,计算机可以优化向量。请查看上面的链接以获取更多信息。