List 从数组中获取值

List 从数组中获取值,list,haskell,List,Haskell,我是Haskell的新手,在一些家庭作业上遇到了麻烦。我不明白如何正确地接收数组,并使用其中的数据 例如,在java中,我会有 int[]arr={…}; arr[0]; arr[1]; 在我的哈斯凯尔问题中 dot::[Float]->[Float]->Float --在这里输入代码 我找不到一种方法来使用浮点数组中的数据。关于这个问题,我的教授的例子使用向量,但我们必须使用[Float] 我不是要求任何人来解决这个问题,只是解释一下如何使用数组。从技术上讲,这不是数组,而是一个链接列表。

我是Haskell的新手,在一些家庭作业上遇到了麻烦。我不明白如何正确地接收数组,并使用其中的数据

例如,在java中,我会有

int[]arr={…};
arr[0];
arr[1];
在我的哈斯凯尔问题中

dot::[Float]->[Float]->Float
--在这里输入代码
我找不到一种方法来使用浮点数组中的数据。关于这个问题,我的教授的例子使用向量,但我们必须使用
[Float]


我不是要求任何人来解决这个问题,只是解释一下如何使用数组。

从技术上讲,这不是数组,而是一个链接列表。那是不一样的。列表定义为:

data [a] = [] | (a:[a])
因此,它是一种具有两个构造函数的数据类型:

  • 空列表
    []
    ,用于表示列表结束;及
  • cons
    有两个元素:一个
    a
    (项目)和一个对尾部的引用(a
    [a]
现在我们知道您可以使用模式匹配来提取元素(并进行测试)。例如,在以下函数中:

head :: [a] -> a
head (x:_) = x
在这里,
head
期望看到一个
cons
构造,它提取head(第一个节点的元素)并返回它。或例如:

second :: [a] -> a
second (_:(x:_)) = x
dot [] [] = 0.0
这里再次使用模式匹配来提取第二个元素

获取元素的另一种方法是使用。操作人员您可以使用以下方法获得第i个元素(从零开始):

list!!i
这在语义上相当于Java中的
list[i]
。但是请注意,正如前面所说,这些是链表,因此获得第i个元素需要O(i)计算工作量。虽然这看起来像是一个细节,但当您想要获取具有大索引的对象时,它可能会变得有点戏剧性。此外,由于调用了
(!!)
,因此您不太确定是否存在这样的元素:您无法保证列表确实足够长。因此,使用模式匹配并寻找巧妙的方法来利用链表数据结构是明智的

例如,对于dot产品,您可以首先使用模式匹配,如:

dot (x:xs) (y:ys) = ...
因此,您从列表中提取了头
x
y
。然后你可以将它们相乘,并将它们添加到列表剩余部分的点积中:

dot (x:xs) (y:ys) = x*y + dot xs ys
现在,您只需定义基本情况,例如:

second :: [a] -> a
second (_:(x:_)) = x
dot [] [] = 0.0
因此,把所有这些放在一起:

dot :: [Float] -> [Float] -> Float
dot [] [] = 0.0
dot (x:xs) (y:ys) = x*y + dot xs ys

非常感谢你,我甚至没想到要做一个基本的案例。我以前看过(x:xs),但不确定它到底是什么意思。这可能是我在stackoverflow上得到的信息最丰富的答案。非常感谢。请注意,这不适用于列表长度不同的情况。你可能应该考虑如何做这件事,即使它不需要分配。@卡尔:我故意把它删掉了,因为点积在两个不同长度的向量上是相当不明确的。您可以假设“虚拟尾部”包含零,但生成向量的代码可能有问题。