2012-01-13 24 views
1

は、私はこれを持っていますか?このデータの逆シリアル化が必要です...IO文字列とIOデータ型

+0

以下の回答されています "あなたが持っている概念的な問題に対処するという意味で、より多くの助けになりました。しかし、あなたは、「役に立たない」修正、getDataFromUser :: IO SomeDataに興味があるかもしれません。 getDataFromUser = readLn'です。 –

答えて

9

getLineを文字列として扱おうとしていますが、実行時に文字列を生成するIOアクションのIO Stringです。あなたはそれを実行して<-を使用してdoブロック内部から結果の値を得るが、getDataFromUser以来IOは、その種類はIO SomeDataでなければならないことができます。

getDataFromUser :: IO SomeData 
getDataFromUser = do 
    line <- getLine 
    return $ read line 

より広く、私はIOでのチュートリアルを読んで推薦しますハスケル、あなたのことを学ぶようにハスケルのchapter on IO;それは他のほとんどの言語のIO機能とは非常に異なっており、どのように物事が合うかに慣れるまでに時間がかかることがあります。このような特定の質問に対する答えを完全に理解するのは難しいです:)

7

あなたはHaskell IOがどのように動作するかを詳しく読んで理解する必要があります。

あなたの例にはいくつかの点があります。 readを使用してSomeDataにデシリアライズする場合は、そのタイプにReadインスタンスを指定する必要があります。

data SomeData = SomeData Int Int deriving (Read) 

第二:あなたはデフォルトのいずれかを使用することができますgetLineString、ないString返しIOアクションです。 readにはStringが必要なので、これがエラーの原因です。これは、あなたが望むものに近いです:

getDataFromUser :: IO SomeData 
getDataFromUser = do str <- getLine 
        return (read str) 

これは次のように簡略化されていますが、これについてはあまり心配する前に、上の例を理解していることを確認することができます。

getDataFromUser :: IO SomeData 
getDataFromUser = liftM read getLine 
関連する問題