Haskell Zip Parse Error

时间:2013-03-26 10:41:48

标签: haskell

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

2 个答案:

答案 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])

但它仍然不会做你想要的!因为NameListPriorityList可能是列表。你想要拉链在一起。但这不是你给zip的内容:你给了zip两个新的单个元素列表。毫无疑问,你只想直接传递这些名单。

printList :: IO ()
printList = do
    putStrLn "Printed Combined List"
    print (zip NameList PriorityList)

哦,但它仍然行不通。甚至不会编译。那为什么呢?因为变量名必须以小写字母(或下划线)开头。您已使用大写字母启动了NameListPriorityList。这就是为什么你的第一个代码块显然无法工作的原因之一。

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)]