我尝试在Haskell中创建一个函数来显示列表的元素,但它不起作用。我做错了什么?
var arr = ['a', 'b', 'c'];
arr[1].pop(); // TypeError
console.log(arr);
它给了我这个错误:
showw :: [Int a]=> [a] -> b
showw []=0
showw (x:xs)= x ++ showw xs
答案 0 :(得分:1)
这里有一些问题。首先,使用括号而不是括号来编写约束:
showw :: (Int a) => [a] -> b
摆脱了一个错误。
现在我不确定你的意图是什么(Int a)
,但Int
不是类型类,所以你不能像这样使用它。也许您的意思是a
是Int
,在这种情况下我们根本不会使用类型变量,只需在其位置使用Int
类型:
showw :: [Int] -> b
现在这个b
漂浮在它的寂寞周围,孤独的类型变量通常是一个问题。它说showw
可以返回任何类型,所以如果我说,嘿,showw
,这里是[1,2,3,4,5]
,请给我一个{{1}它将不得不返回一头大象。
由于您要“显示”列表,我假设您要返回Elephant
String
这是一个合理的签名。现在来执行:
showw :: [Int] -> String
要显示一个空列表,你......给0?这没有意义。您可能需要空字符串show [] = 0
。
然后这一行:
""
您尝试将showw (x:xs) = x ++ showw xs
(Int
)与x
(String
)连接起来,这是不允许的。您需要先将showw xs
转换为字符串,我猜您应该使用常规x
函数来执行此操作。
也就是说,show
功能已经可以显示列表。但我认为你在练习。
答案 1 :(得分:1)
这里有一些问题。
第一个问题是类型签名。 Int是一种类型,但是您的语法使它看起来像一个类型类。如果你有一个获取Int列表并输出其他值的函数,它应该如下所示:
func :: [Int] -> a
当然,只有当您将功能限制为Ints时才有效。如果要包含其他类型的数字, do 需要使用类型类。例如,如果您想使用Num,则类型签名将如下所示:
func :: Num a => a -> b
但即使您修复了类型签名,您仍然会收到错误,因为您的函数的返回类型并不一致。 showw []
返回0(Int),但非空列表上的showw
返回值列表。您可能希望showw []
返回[0]
或[]
。
如果你想显示这些值,就像将它们转换为字符串一样,你需要使用一个函数来进行转换。您可以将该函数应用于第三行的x
,以及showw []
的返回值。