我正在使用递归查找列表长度的代码,但是存在很多错误。我是一个非常初学者,我不能很好地Haskell。 这是代码:
longListe :: [a] -> a
longListe [] = error "Empty liste"
longListe [x]= 1
longListe n = 1 + longListe (n-1)
main = print $ longListe
和错误:
No instance for (Num a) arising from the literal ‘1’
Possible fix:
add (Num a) to the context of
the type signature for longListe :: [a] -> a
In the expression: 1
In an equation for ‘longListe’: longListe [x] = 1
4-1-a.hs:6:31:
No instance for (Num [a]) arising from a use of ‘-’
In the first argument of ‘longListe’, namely ‘(n - 1)’
In the second argument of ‘(+)’, namely ‘longListe (n - 1)’
In the expression: 1 + longListe (n - 1)
4-1-a.hs:7:8:
No instance for (Show ([a0] -> a0))
(maybe you haven't applied enough arguments to a function?)
arising from a use of ‘print’
In the expression: print
In the expression: print $ longListe
In an equation for ‘main’: main = print $ longListe
有人可以帮助我。谢谢
答案 0 :(得分:5)
问题在于函数的类型定义:longListe :: [a] -> a
。
如果您在号码列表上拨打longListe
,则可以正常使用。例如,如果您致电longListe [1,2,3]
,则输入将为[Int] -> Int
。
但是,如果您尝试获取字符串列表的长度,则此类型将变为[String] -> String
。这是不您想要的,因为您想要返回一个数字。
您得到的错误表明:
没有(字母a)来自字面'1'的实例
由于您返回一个数字并在输入时执行数值运算,编译器希望a
为数字,因此错误提及(Num a)
。
如果你将定义更改为longListe :: [a] -> Int
,它应该会更好(实际上它仍然无法正常工作,但出于不同的原因,但我会让你自己尝试解决这个问题,因为这是最好的方法学习)。
另外,有没有理由为什么空列表应该出错而不是返回0?