お気づきのように、エラーメッセージにはread
の問題があるので、それに焦点を当てましょう。
私がコメントで述べたように、read
は、あるデータ型の値の文字列表現を取り、それを解析してその値を返します。いくつかの例:
read "3.14" :: Double ≡ 3.14 :: Double
read "'a'" :: Char ≡ 'a' :: Char
read "[1,2,3]" :: [Int] ≡ [1,2,3] :: [Int]
一部nonexamples:
read "[1,2," :: [Int] ≡ error "*** Exception: Prelude.read: no parse"
read "abc" :: Int ≡ error "*** Exception: Prelude.read: no parse"
あなたがread
のString
バージョン(すなわちread :: String → String
)を使用しようとするとどうなりますか?
ハスケルのString
の表現(例:GHCiでString
を返すものを評価する場合)は、" ... "
の引用符で囲まれた一連の文字で構成されます。もちろん、の表示を(改行のような)いくつかの特殊文字にしたい場合、そこにエスケープされたバージョン(この場合は\n
)を入れなければなりません。
read
は値の文字列表現を期待していると書いていますか?あなたの場合、read
はと正確にはの文字列形式を想定しています。当然、最初にしようとするのはオープニングの見積もりと一致させることです。最初の行が"
で始まるでないので、read
はプログラムに文句を付けてクラッシュします。
read "hello" :: String
は、read "1" :: [Int]
が失敗するのと同じ方法で失敗します。 1
だけでは、Int
のリストとして解析できません。read
は、括弧[
を開始して文字列を開始すると想定しています。
また逆である、show
の聞いたことがあるかもしれない(しかし非常に緩い意味で)read
へ。目安として、read
の値をx
に設定すると、read
の文字列表現はshow x
のようになります。
あなたはあなたのコードがうまく動作し、次の入力生み出す
"this is line one"
"another line"
"and the final line"
次へファイルの内容を変更した場合:あなたがしたくない場合は
["this is line one","another line","and the final line"]
を.txt
ファイルを変更するには、list = listLines myLines
を削除し、print myLines
を削除してください。ただし、プログラムを実行すると、再度
["this is line one","another line","and the final line"]
が返されます。だから何が問題なの?
print = putStrLn ∘ show
とshow
のデフォルトの動作それは何か(一部a
ため、すなわち[a]
; Char
を除いては、特別な治療を受ける)のリストをINGのshow
に来る文字列[ firstElement , secondElement ... lastElement ]
を生成することです。ご覧のとおり、[ ... ]
を避けたい場合は、[String]
をまとめてマージする必要があります。
lines
の逆数であるunlines
という素晴らしい機能があります。また、print
は最初にshow
と呼ばれますが、この場合は望んでいません。だから私たちはputStrLn
を使用しています。最終バージョン:我々はまた、不要なlines ~ unlines
だけputStrLn contents
を取り除くことができ
main = do
handle <- openFile "data.txt" ReadMode
contents <- hGetContents handle
let myLines = lines contents
putStrLn (unlines myLines)
hClose handle
。
'listLines'は何をすると思いますか? – Vitus
ところで、 'String→String'バージョンの' read'は、Haskell文字列フォーマット( '' Hello \\ "world \\" ''のような生の文字列)を期待し、それを '' Hello "world" ''に変換します。あなたがファイルから得たものを印刷したいだけなら、 'list = listLines myLines'を完全に削除してください。 – Vitus
'listLines'は文字列のリストを取り、文字列のリストを返すと期待しています。うーん、私は生の文字列が私のコードと関係があるのかどうか本当に理解していないのですか?もっと説明できますか? – turtle