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

时间:2017-05-12 00:43:11

标签: haskell

我尝试在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

2 个答案:

答案 0 :(得分:1)

这里有一些问题。首先,使用括号而不是括号来编写约束:

showw :: (Int a) => [a] -> b

摆脱了一个错误。

现在我不确定你的意图是什么(Int a),但Int不是类型类,所以你不能像这样使用它。也许您的意思是aInt,在这种情况下我们根本不会使用类型变量,只需在其位置使用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)与xString)连接起来,这是不允许的。您需要先将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 []的返回值。