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