-3

我正在尝试使用 Haskell 中的 zip 函数将两个列表连接在一起。可以按如下方式定义列表和收集信息:

 priority <- getLine    
 let priorityList = []
 priority : priorityList

 name<- getLine
 let nameList = []
 name : nameList

收集信息后,预期的输出将是 priorityList = [1,2,3] & nameList = [test1, test2, test3]。但是,这对于问题的目的并不重要,可以假设这两个列表采用以下格式:

  priorityList = [1,2,3]
  nameList = [test1, test2, test3]

我需要将列表和打印与以下功能结合起来。但是,我收到错误“输入“zip”时出现解析错误”

printList :: IO ()
printList = do putStrLn "Printed Combined List"
               zip [nameList][priorityList]
4

2 回答 2

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)
于 2013-03-26T11:19:41.210 回答
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)]
于 2013-03-27T09:24:44.213 回答