我尝试在Haskell中创建一个函数来显示列表的元素,但它不起作用。我做错了什么?
showw :: [Int a]=> [a] -> b
showw []=0
showw (x:xs)= x ++ showw xs
它给了我这个错误:
aplicatie.hs:1:12: error:
• Expected a constraint, but ‘[Int a]’ has kind ‘*’
• In the type signature: afisare :: [Int a] => [a] -> b
aplicatie.hs:1:13: error:
• Expecting one fewer argument to ‘Int’ Expected kind ‘* -> *’, but
‘Int’ has kind ‘*’
• In the type signature: afisare :: [Int a] => [a] -> b
这里有几个问题。
第一个问题在于类型签名。Int 是一个类型,但您的语法使它看起来像一个类型类。如果你有一个函数,它接受一个 Int 列表并输出一些其他值,它应该看起来像这样:
func :: [Int] -> a
当然,这只有在您打算将函数限制为 Int 时才有效。如果要包含其他类型的数字,则需要使用类型类。例如,如果你想使用 Num,类型签名将如下所示:
func :: Num a => a -> b
但是,即使您修复了类型签名,您仍然会收到错误,因为函数的返回类型不一致。showw []
返回 0(整数),但非空列表上的showw
返回值列表。您可能希望showw []
返回[0]
或[]
。
如果你想显示这些值,就像将它们转换为字符串一样,你需要使用一个函数来执行该转换。您可以将该函数应用于第三行的x
,以及返回值showw []
。
这里有几个问题。 首先,约束是用括号而不是括号写的:
showw :: (Int a) => [a] -> b
这消除了一个错误。
现在我不确定你打算(Int a)
什么,但Int
不是类型类,所以你不能这样使用它。 也许你的意思是a
是一个Int
,在这种情况下,我们根本不会使用类型变量,而只是使用Int
类型来代替它:
showw :: [Int] -> b
现在有这个b
靠它的孤独四处游荡,孤独类型的变量通常是一个问题。 它说showw
可以返回任何类型的,所以如果我说,嘿,showw
,这是[1,2,3,4,5]
,给我一个Elephant
它必须返回一头大象。
由于您想"显示"列表,我假设您想返回一个String
showw :: [Int] -> String
这是一个合理的签名。 现在到实现:
show [] = 0
要显示空列表,您...给0? 这说不通。 您可能希望空字符串""
.
然后是这一行:
showw (x:xs) = x ++ showw xs
您尝试将Int
(x
)与String
(showw xs
)连接起来,这是不允许的。 您需要先将x
转换为字符串,我想您应该使用常规show
函数来执行此操作。
也就是说,show
函数已经可以显示列表。 但我假设你在练习。