Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Haskell中使用列表_Haskell - Fatal编程技术网

在Haskell中使用列表

在Haskell中使用列表,haskell,Haskell,我试图学习Haskell中的列表,但我有一个错误,我不明白 我一直在尝试定义论点,但老实说,我还不太了解haskell lefgNLista:: [Int]->[Int]->Int lefgNLista []=[] lefgNLista (fre1:fre2) fre3 = if fre1 == fre3 then 1+lefgNLista else fre1 : lefgNLista fre2 也尝试过这样做,但又出现了另一个错误 lefgNLista []=[]=0 我希望

我试图学习Haskell中的列表,但我有一个错误,我不明白

我一直在尝试定义论点,但老实说,我还不太了解haskell

lefgNLista:: [Int]->[Int]->Int
lefgNLista []=[]
lefgNLista (fre1:fre2) fre3  = if fre1 == fre3 then 1+lefgNLista else fre1 : lefgNLista fre2
也尝试过这样做,但又出现了另一个错误

lefgNLista []=[]=0
我希望函数计算列表中N个数字的数量,例如

ghci> lefgNLista [1,3,5,7,8,8,2,3,8] 8 
3

下面是一个可能的定义,逐项解释

我将省略这一类型。如果需要,可以将此函数的类型设置为
[Int]->[Int]->Int
,但这不是最好的类型。编译器能够为您推断出最佳类型

定义中有两部分,一部分用于空列表,另一部分用于非空列表

空列表中有多少个元素?零。其中有多少等于任何给定值?也是零

lefgNLista [] _ = 0
--         []             ⇒ the empty list
--            _           ⇒ "any given element", we are not looking at it, hence no name
--              =         ⇒ "is defined as"
--                0       ⇒ that's zero
好,现在让我们看一个非空列表。本部分还有两个案例。我们看一下列表的第一个元素。要么等于我们正在计算的,要么不等于

lefgNLista (x:xs) y | x == y = 1 + lefgNLista xs y
                    | otherwise =  lefgNLista xs y
--         (x:xs)                                  ⇒ A customary way to name a list pattern
--                y                                ⇒ The value we want to count
--                  |                              ⇒ Pronounced "when"
--                    x == y                       ⇒ Self evident
--                           =                     ⇒ "is defined as"
--                             1 + lefgNLista xs y ⇒ Compute for the rest of list and add 1 
--                  | otherwise =                  ⇒ Self evident
--                                 lefgNLista xs y ⇒ Just compute for the rest of list
那么Haskell推断出的是什么类型

Prelude λ :t lefgNLista
lefgNLista :: (Num p, Eq t) => [t] -> t -> p
这并不像看上去那么可怕。您可以将其理解为“当
p
是某种数字,而
t
是某种可以检查是否相等的东西时,类型是
[t]->t->p
”。因此,此函数适用于
Int
Double
(Int,Int)
或任何其他您可以比较的类型,甚至适用于其他列表

Prelude λ lefgNLista [[1,2], [3,5], [1,2]] [1,2]
2

那么
nump
Int
不是唯一可以使用的类型。如果您的列表非常长,您可能需要
Integer
,或者您可能想使用自己喜欢的数字类型,但在这一点上这可能太高级了。

片段基本上是正确的。看起来所需的
countElem
filter
交织在一起。这对我来说似乎有点宽泛,并没有真正显示出对Haskell的基本理解。我想知道,对于你来说,目前的教程场景是否比StackOverflow更好。祝你好运。
fre1==fre3
是错误的,因为
fre1::Int
fre3::[Int]
@HTNW:no,片段错误了好几次。例如,代码提示结果应该是
Int
,但第一行返回一个列表
[]
。至于第二行,这暗示
fre3
也应该是一个列表,但是如果我们看一下主体,我们会检查
fre1==fre3
,因此我们会检查元素是否相同,等等@WillemVanOnsem在@n.m.发布他们的答案之前,我正在写一个答案,正如我看到的那样,第一个等式中似乎忽略了第二个参数,因为它被忽略,
[]
返回,因为它和
0
都是“空的”。LHSs展示了对模式匹配的理解,他们似乎知道递归和如何使用列表。是的,代码和格式有点僵硬,但是有一个明确的规范,代码用它更有意义。这比其他初学者在这个标签下的一些问题要好得多,而且这对我们很好。