Haskell简单地显示了列表程序的元素



我尝试在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函数已经可以显示列表。 但我假设你在练习。

最新更新