在Haskell中打印列表

时间:2014-11-17 20:13:26

标签: haskell

我确定这些都是非常愚蠢的错误,但我正在尝试转换并打印两个列表,我在ghci上收到错误。

首先,我想从此转换:

["2","2","2"] 

到这个

[2,2,2]

为此,我写了这个函数:

convert (x:xs) = [read x | x <- xs]

但这似乎不起作用......

第二

这是我的打印功能:

print_results [] _ = error("Empty List!")
print_results _ [] = error("Empty List!")
print_results (x:xs) (y:ys) = print x ++ " + " ++ print y : print_results xs ys

对于此输入:

[2,2,2] and [3,3,3]

所需的输出应为:

2 + 3
2 + 3
2 + 3

提前致谢!

2 个答案:

答案 0 :(得分:3)

这些不是“愚蠢”的错误,但是你将不得不退后一步“我在这里写什么类型”,以便了解正在发生的事情。我注意到你今天围绕这些问题提出了一系列重叠的问题。我希望我们作为一个社区可以为您提供一个能让您走上正确轨道的答案。有鉴于此,我正在对社区Wiki进行标记,并鼓励其他人对其进行编辑。

在Haskell中,每个值都有一个特定的具体类型。我们可以编写适用于多个类型的函数。其中一些工作在所有类型上:replicate 5 :: a -> [a]根本不关心a是什么。有些仅适用于某些类型:read :: Read a => String -> a要求a成为类Read的实例。

现在,您应该假设,为了实际运行函数并在GHCi或编译代码中打印结果,您需要将所有类型变量替换为特定类型。 (这在很多方面都是错误的,我或其他人可能会扩展。)

编写函数后,向GHCi询问推断类型,这通常是最常见的签名:

> :t map read
map read :: Read a -> [String] -> [a]

> :t map read $ ["as","ew"]
> map read $ ["as","ew"] :: Read a => [a]

请注意,我们仍然有一个类型变量。我们需要选择一种特定的类型。 @chi和我都鼓励你做的是在某处添加类型注释来修复该类型。但是如果你将这种类型修改为Int,你就会试图将“as”和“ew”解析为数字,这显然会失败。

答案 1 :(得分:1)

首先:

convert :: [String] -> [Int]
convert xs = [read x | x <- xs]

甚至

convert :: [String] -> [Int]
convert = map read

请注意,类型注释很重要,因为没有它,Haskell不会如何read字符串(作为Int?a Char?a tree?a list?etc。)

第二

print_results []    []      = []
print_results []     _      = error "Empty List!"
print_results _      []     = error "Empty List!"
print_results (x:xs) (y:ys) = (show x ++ " + " ++ show y) : print_results xs ys

上面将计算一个字符串列表,格式如您所愿。如果你真的想打印它们做IO动作,你可以使用

mapM_ putStrLn (print_results list1 list2)