在Haskell中使用列表
我试图学习Haskell中的列表,但我有一个错误,我不明白 我一直在尝试定义论点,但老实说,我还不太了解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 我希望
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展示了对模式匹配的理解,他们似乎知道递归和如何使用列表。是的,代码和格式有点僵硬,但是有一个明确的规范,代码用它更有意义。这比其他初学者在这个标签下的一些问题要好得多,而且这对我们很好。