我试图在Haskell中使用zip函数将两个列表连接在一起。列表可以定义,信息收集如下:
priority <- getLine
let priorityList = []
priority : priorityList
name<- getLine
let nameList = []
name : nameList
收集信息后,预期的输出将是priorityList = [1,2,3]&amp; nameList = [test1,test2,test3]。但是,这对于问题的目的并不重要,可以假设这两个列表的格式如下:
priorityList = [1,2,3]
nameList = [test1, test2, test3]
我需要将列表和打印与以下功能结合起来。但是,我在输入`zip''
上收到错误'解析错误printList :: IO ()
printList = do putStrLn "Printed Combined List"
zip [nameList][priorityList]
答案 0 :(得分:8)
printList :: IO ()
printList = do putStrLn "Printed Combined List"
zip [NameList][PriorityList]
此代码存在许多问题。
您看到的解析错误是因为do块未正确对齐。最后一行的zip
必须与之前的putStrLn
对齐。所以要么
printList :: IO ()
printList = do putStrLn "Printed Combined List"
zip [NameList][PriorityList]
或
printList :: IO ()
printList = do
putStrLn "Printed Combined List"
zip [NameList][PriorityList]
但那仍然行不通。 printList
被声明为IO操作,这意味着do块的最后一行也必须是IO操作......但是zip
会产生一个列表。你可能意味着这个:
printList :: IO [(String, Int)]
printList = do
putStrLn "Printed Combined List"
return (zip [NameList][PriorityList])
但是只有在直接从ghci提示符运行时才打印出结果。最好明确地打印出来:
printList :: IO ()
printList = do
putStrLn "Printed Combined List"
print (zip [NameList][PriorityList])
但它仍然不会做你想要的!因为NameList
和PriorityList
可能是列表。你想要拉链在一起。但这不是你给zip
的内容:你给了zip
两个新的单个元素列表。毫无疑问,你只想直接传递这些名单。
printList :: IO ()
printList = do
putStrLn "Printed Combined List"
print (zip NameList PriorityList)
哦,但它仍然行不通。甚至不会编译。那为什么呢?因为变量名必须以小写字母(或下划线)开头。您已使用大写字母启动了NameList
和PriorityList
。这就是为什么你的第一个代码块显然无法工作的原因之一。
printList :: IO ()
printList = do
putStrLn "Printed Combined List"
print (zip nameList priorityList)
答案 1 :(得分:1)
使用上述帮助,我已经能够构建一个函数(下面)来实现成功的ZIP(不包括信息收集)。
printList :: IO ()
printList = do
let nameList = ["test1", "test2", "test3"]
let prioirtyList = [1, 2, 3]
putStrLn "Printed Combined List"
print (zip nameList prioirtyList)
我的输出如下:
*Main> printList
Printed Combined List
[("test1",1),("test2",2),("test3",3)]