2012-02-05 5 views

答えて

17

これはできません。 IO [[Int]]を含まず、[[Int]]を含みません。これは実行されるとタイプ[[Int]]の結果を生成するIOを実行する必須プログラムの記述です。このような記述は決して実行されることはなく、任意の回数実行されることもあります(毎回[[Int]]を生成し、必ずしも同じものである必要はありません)。

ハスケルは純粋な言語なので、IOの説明を直接実行する方法はありません。代わりに、より大きな説明にそれらを組み立てることができます。 IOが実際に実行されるようにするには、mainIOアクションと定義し、プログラムの実行時に実行します。 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 FAQintroduction to IOを参照してください。

+0

ああ、あなたの答えを拡大し、それによって私の答えはほとんど冗長になりました:-) –

8

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はそうではありません。これは副作用を表し、コードから副作用を取り除くことはできません。

関連する問題