2

についてほとんど何も知らず、Haskellの IOを理解するために多くのチュートリアルとコード サンプルを読んでいますが、まだ明確ではありません。

すべての例は次のようになります。

main = do  
    putStrLn "Hello, what's your name?"  
    name <- getLine  
    putStrLn ("Hey " ++ name ++ ", welcome !") 

彼らは IO から文字列を読み取ります。入力をカスタマイズする例が他にもたくさんありますが、私にはわかりません。

私の質問は単純です: How to read Int, Float, Doubleor Charlike using Cscanf in a format string?

そして、IOのカスタマイズやトリックの明確な説明を手伝ってくれる人はいますか?

ヒント: コードに main 関数が含まれていれば、テストが容易になります。

CC++JavaC#Matlabおよびで非常に優れたコーディング経験がありPHPます。

4

3 に答える 3

4

最も直接的な方法は、次のように使用するreadことです (多くの場合、明示的な型を指定する必要があります)。

main = do  
    putStrLn "Hello, what's your age?"  
    age <- liftM read getLine :: IO Int
    putStrLn ("Hey " ++ (show age)  ++ ", welcome !")

これは、文字列に単一の値のみが含まれていることがわかっている場合にうまく機能します (文字列を目的のデータ型として解析できない場合は例外がスローされます)。より複雑な構文解析については、通常、Parsecパーサー コンビネーター ライブラリに直接ジャンプします (Haskell で必要になるパーサーはおそらくこれだけですが、最小限のオーバーヘッドで単純なジョブも処理します)。それがあなたに合わない場合は、Hackage をすばやく検索すると、より単純な scanf のような関数を提供するライブラリの候補がいくつか見つかります。特に、Text.XFormat.ReadおよびText.PrintScanを参照してください。ただし、個人的にはどちらも保証できません。

于 2012-12-08T08:48:12.610 に答える
3

isturdy の答えは有効ですが、もう少し単純なものが必要な場合は、段階的に行うのが最も簡単な方法です。

main = do
    i' <- getLine -- some integral input; it will be received as a String
    d' <- getLine -- some floating input; also will be received as a String
    let i = read i' :: Int -- i is an Int now
        d = read d' :: Double -- d is a Double now
    putStr "" -- so that GHC doesn't complain

getLineisのタイプは、IO String入力を として読み取りますString。次に、この文字列のタイプを変更できますread(必要なタイプを示します)。のようscanfな体験については、次のようなものを試すことができます。

main = do
    inp <- getLine -- the input is an Int, a String and a Double, like: 4 derp 2.7
    let list = words inp -- divide the input String into a list of Strings
        val = read (list !! 0) :: Int -- val equals 4, its type is Int
        str = list !! 1 -- str is a String ("derp"), no additional action required
        dbl = read (list !! 2) :: Double -- dbl equals 2.7 and is a Double
    putStr ""
于 2012-12-08T20:11:12.327 に答える
1

Read 型クラスを掘り下げる必要があります。これは、文字列から読み取ることができる値の標準的な typecals であり、エラー報告が必要ない制御された環境で非常に役立ちます。独自のデータ型を読みたい場合は、おそらくderiving Readステートメントを使用する必要があります。

ただし、任意の入力を読みたい場合は、parsecライブラリを使用するのが標準です。Parsec は、いくつかの定義済みの基本的なパーサーを備えたパーサー コンビネーター ライブラリです。追加のパッケージは、数値用の多くのパーサーを提供します。特別な高速パーサー コンビネーター ライブラリとパーサー ジェネレーターも存在します。

于 2012-12-08T20:47:20.037 に答える