可能性の重複:
Convert Haskell IO list to list typeHaskellでIO [[Int]]を[[Int]]に変換するにはどうすればよいですか?
私が探して試してみたが、適切な答えを見つけるしていないようでした、これは最初の場所で可能ですか?これについての助けに感謝します。
可能性の重複:
Convert Haskell IO list to list typeHaskellでIO [[Int]]を[[Int]]に変換するにはどうすればよいですか?
私が探して試してみたが、適切な答えを見つけるしていないようでした、これは最初の場所で可能ですか?これについての助けに感謝します。
これはできません。 IO [[Int]]
はを含まず、と[[Int]]
を含みません。これは実行されるとタイプ[[Int]]
の結果を生成するIOを実行する必須プログラムの記述です。このような記述は決して実行されることはなく、任意の回数実行されることもあります(毎回[[Int]]
を生成し、必ずしも同じものである必要はありません)。
ハスケルは純粋な言語なので、IO
の説明を直接実行する方法はありません。代わりに、より大きな説明にそれらを組み立てることができます。 IOが実際に実行されるようにするには、main
をIO
アクションと定義し、プログラムの実行時に実行します。 GHCiにIO
アクション(putStrLn "Hello, world!"
など)を入力すると、それを実行します。
IO
のアクションを構成する最も簡単な方法は、すでに使用されているdo
という表記法です。ここでは例です:
myAction :: IO [[Int]]
myAction = ...
main :: IO()
main = do
xs <- myAction
-- now xs is a normal value with type [[Int]]
print xs
は、より多くの情報のためthis FAQとintroduction to IOを参照してください。
ehirdによる回答は正しい - タイプIO [[Int]]
の値は、整数のリストを取得する方法の説明です。これは、アクションとも呼ばれます。
[[Int]]
を取得するには、を実行してください。を実行してください。 <-
演算子はdo
の表記で行うことができます。これにより、アクションを実行した結果が得られ、必要に応じてこの値を操作できます。しかし、あなたはまだIOモナドに値を戻す必要があります。具体的なコードでは、それは次のようになります。
sumAll :: IO [[Int]] -> IO Int
sumAll io_lists = do
lists <- io_lists
return $ sum $ map sum lists
は、lists
はIOアクションを行った結果にバインドされています。したがって、sum
を問題なくマップすることができます。 IOモナドのreturn
関数は、戻り値の型がIO Int
になるように、モナドに奥行きを「戻す」ようにします。モナドによってはモナドから値を取ることができますが、IOはそうではありません。これは副作用を表し、コードから副作用を取り除くことはできません。
ああ、あなたの答えを拡大し、それによって私の答えはほとんど冗長になりました:-) –