まず、その読書のものを観察し、その後すぐに、それは神秘的なエラーが発生することができ、印刷:
GHCi, version 8.0.0.20160421: http://www.haskell.org/ghc/ :? for help
Prelude λ read "123"
*** Exception: Prelude.read: no parse
理由は、あなたが読みたいタイプを指定していないということです。
Prelude λ read "123" :: Integer
123
が、少しヘルパー関数を導入することが時には簡単です:あなたは、型注釈を使用してこれに対抗することができます主な問題に今
Prelude λ let readInteger = read :: String -> Integer
Prelude λ readInteger "123"
123
を。 read(hGetLine inputFile)
はhGetLine inputFile
が返され、IO String
とread
がString
を必要とするために機能しません。これは、2つの段階で解決することができます。
line <- hGetLine inputFile
let isbn = readInteger line
注2つの異なる構築<-
とlet .. =
、彼らは別のことを行います。あなたは何を正確に把握できますか?
別の答えに示すように、あなたはそれほど冗長な方法でそれを行うことができます。
ISBN < - あなたはread
ような単純なことを行う場合に最適ですFMAP readInteger(hGetLineで、inputFile)
。しかし、中間結果に明示的に名前を付けることがしばしば望ましい。このような場合には、<-
およびlet .. =
構成を使用できます。
それはまだ私のために少し曇っています。 readIntegerはString - > Intですので、 "let .. ="は何とかIO String - > IO Integerに変更されます。あれは正しいですか? –
正確ではありません。 'hGetLine inputFile'は' IO String'ですが、 'line < - hGetLine inputFile'と言うと、' line'は単に 'String'です。 'let .. ='はIOを追加しません。あなたは 'do'ブロックの最後の行で、例えば' print isbn'を使ってIOに戻る必要があります(これは 'IO()'を返します)。 –
'line < - hGetLine inputFile'、 '< - 'は 'IO String'を 'String'に変換しますか? –