-3

Haskellのzip機能を使って2つのリストを結合しようとしています。リストは次のように定義され、情報が収集されます。

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

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

情報を収集した後、期待される出力はpriorityList = [1,2,3]&nameList = [test1、test2、test3]になります。ただし、これは質問の目的には重要ではありません。2つのリストは次の形式であると想定できます。

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

しかし、それでもあなたが望むことはできません!NameListPriorityListは、おそらくリストだからです。一緒にジッパーで留めたいこと。しかし、それはあなたが与えているものではありませんzip:あなたはzip2つの新しい単一要素リストを与えています。あなたは間違いなく、リストを直接渡すことだけを意図していました。

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

ああ、でもそれでもうまくいきません。コンパイルすらしません。なんで?変数名は小文字(またはアンダースコア)で始める必要があるためです。そして、あなたは大文字と大文字の両方から始めましNameListPriorityList。これが、コードの最初のブロックが明らかに機能しなかった理由の1つです。

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 に答える