9

この形式で整数のリストを出力しようとしています

[1]
[2]
[3]

したがって、私の関数は整数のリストを取り、次のように IO () を返します。

import System.IO

printVector :: [Integer] -> IO ()
printVector (x:xs) = putStr("[" ++ show(x) ++ "]" ++ "\n") : printVector xs

しかし、ghcは私にエラーを与えます:

lin-test.hs:5:22:
Couldn't match expected type `IO ()' with actual type `[a0]'
In the expression:
  putStr ("[" ++ show (x) ++ "]" ++ "") : printVector xs
In an equation for `printVector':
    printVector (x : xs)
      = putStr ("[" ++ show (x) ++ "]" ++ "") : printVector xs
Failed, modules loaded: none.

これで、関数がリスト全体を実行し、最初の項目 'x' を最初に取り、次に : printVector xs を使用して、リスト内の各項目に同じ putStr 関数を適用して残りのリストを再帰的に呼び出すことを理解しています。

しかし、私の問題はどこにあると思いますか: printVector xs? ここで私が間違っていることを誰かが指摘できますか?

4

1 に答える 1

15

リストをマッピングする必要がありますが、これらは IO アクションであるため、それらを実行する必要もあります (map実行せずに IO アクションのリストを返すため、次の例を参照してください)。

sequence $ map (putStrLn . show) [1,2,3,4]

すでにそれを行う関数がありますmapM。したがって、例は次のように単純化できます。

mapM (putStrLn . show) [1,2,3,4]

もう 1 つできることは、代わりにmapM_which uses を使用してsequence_、各要素に対して IO アクションを実行した結果を無視することです。したがって、戻り値の型は(前の例)IO ()の代わりになります。IO [()]

mapM_ (putStrLn . show) [1,2,3,4]
于 2013-03-16T14:41:51.463 に答える