私はこれらの2つのコードスニペットを持っています。これは同じことをすると思いますが、そうではありません。何故ですか?
これは正常に動作します:
fdup :: String -> IO ()
fdup filename = do
h <- openFile filename ReadMode
c <- hGetContents h
putStr $ unlines $ parse $ lines c
hClose h
これはエラーを返しますCouldn't match expected type ‘IO [String]’ with actual type ‘[String]’
:
fdup' :: String -> IO ()
fdup' filename = do
h <- openFile filename ReadMode
c <- hGetContents h
ls <- lines c
putStr $ unlines $ parse $ ls
hClose h
parse :: [String] -> [String]
それらの違いは何ですか?
Willem Van Onsemが説明したように、<-
これlines c
は文字列のリストであり、IO
計算ではないため、特定の場所に配置する必要はありません。名前を付けたい場合は、代わりにlet-bindingを使用できます。
fdup' :: String -> IO ()
fdup' filename = do
h <- openFile filename ReadMode
c <- hGetContents h
let ls = lines c
putStr $ unlines $ parse $ ls
hClose h
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加