Haskell Zip Parse Error

Zee*_*eeV -3 haskell

我试图在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)

dav*_*420 8

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)

哦,但它仍然无法正常工作.甚至不会编译.那为什么呢?因为变量名必须以小写字母(或下划线)开头.并且已经开始进入这两个NameListPriorityList用大写字母.这就是为什么你的第一个代码块显然无法工作的原因之一.

printList :: IO ()
printList = do
    putStrLn "Printed Combined List"
    print (zip nameList priorityList)
Run Code Online (Sandbox Code Playgroud)