2012-03-12 12 views
6

この関数を使用すると、文字列のリストを入力できます。この関数は長さをとり、ユーザーが長さ1行以上の行を入力できるようにします。次に、各行をチェックして、元の行と同じ長さになっていることを確認します。コード:Haskell readLn解析エラーなし

readme :: IO [Line] 
readme = do 
line <- readLn 
let count = length line 
lines <- replicateM (count-1) $ do 
    line <- readLn 
    if length line /= count 
    then fail "too long or too short" 
    else return line 
return $ line : lines 

行は文字列です。 *例外:ユーザー・エラー(Prelude.readIO:なしパース)私は機能と入力を実行しようとすると

..私は、次の取得[「12」、「13」]と言うと、私はできませんなぜ、どのようなアイデアを把握する?

答えて

7

あなたが間違ったタイプのものを読み込もうとしているからです。

Lineは、Stringです。 [Char]。しかし、入力している入力は["12", "13"]の形式で、タイプが[Line]、別名である必要があります。 [String]または[[Char]]

Lineとなるように説明する必要があります。実際にはとなっています。 Lineを文字列にしたいのであれば、なぜ端末に文字列のリストを入力していますか?この場合、あなたのロジックに何か問題があります。

あなたは正方行列を入力するための方法をしたい場合は、代わりにtype Line = [Int]をさせることができ、これらのいずれかの形式を使用します。あなたが本当に入力ラインにしたい場合は、

-- What you type at the terminal: 
1 -2 3 
4 5 6 
6 7 8 

-- How to read it in your program: 
line <- (map read . words) `fmap` getLine 

-- What you type at the terminal: 
[1, -2, 3] 
[4, 5, 6] 
[6, 7, 8] 

-- How to read it in your program: 
line <- readLn 

type Line = [Char]ているので、その各数

-- What you type at the terminal: 
[97, 98, 99] 
[100, 101, 102] 
[103, 104, 105] 

-- How to read it in your program: 
line <- (map toEnum) `fmap` readLn 
+0

基本的にreadmeは、行の長さが同じであることを確認するために数独四角形の入力を確認するために使用されます。["1"、 "2"、 "3"]を入力すると、それは3x3グリッドになります)、どちらも長さ3でなければなりません。 – gdrules

+0

解決しました - ありがとう:) – gdrules

4

それは任意のヘルプだ場合は、あなたのプログラムがトンを受け入れる:入力リストにあなたが端末上[97, 98, 99]を入力すると、あなたは文字列​​を得ることを意味し、Unicode文字になります彼は、入力を次

*Main> readme 
"abc" 
"123" 
"456" 
["abc","123","456"] 

あなたはgetLine代わりのreadLnを、書くことを意図している場合がありますが、あなたのプログラムの目的を知らなくても、これが言うには少し難しいです。 getLineに変更

は、プログラムが受け入れ:

*Main> readme 
abc 
123 
456 
["abc","123","456"] 
+0

彼は彼の意図を説明するより古い質問をいくつか持っています。彼は前に 'getLine'を使ってみましたが、ユーザーが入力した(論理的な)リストの長さを測定し、文字列の長さを測定する必要がないので、これは望んでいなかったようです。 – dflemstr

4

readは非常にユーザーフレンドリーではありません、それは文字列として["12","13"]見ていません。 "123"または['1','2','3']、さらには"[\"12\",\"13\"]"を受け入れることになります。言い換えれば、文字列はプログラムのように記述する必要があります。この場合、の代わりにgetLineを使用すると、Stringと表示されるので、readを使用する必要はありません。

+0

彼は実際には入力を文字列として読み取ることを望んでいません。ユーザーの古い質問を参照してください。 – dflemstr

+0

うわー、あなたは本当にあなたの宿題をしました、upvoteを持っています。あなたのプロフィールの写真にレイトレースを書きましたか? –

+0

話題にはほど遠いですが、私が使ったレイトレースは[LuxRender](http://www.luxrender.net)です。 – dflemstr