糖一個使用 Do 表示法的函式。但是我在創建/轉換函式以僅使用 >>= 和 lambda 方面有些掙扎。任何幫助表示贊賞。
此函式獲取檔案路徑,讀取它,將其轉換為串列,然后獲取結果串列,根據其長度將其分成兩半,最后寫入兩個檔案,一個取串列的前半部分,一個檔案包含名單的后半部分。無論如何,這就是想法。
splitFile :: FilePath -> IO ()
splitFile file = do
x <- readFileUTF8 file
let y = splitAt (div (length $ lines x) 2) $ lines x
writeFile "/tmp/foo.txt-part1" $ unlines $ fst y
writeFile "/tmp/foo.txt-part2" $ unlines $ snd y
uj5u.com熱心網友回復:
splitFile :: FilePath -> IO ()
splitFile file =
readFileUTF8 file >>= \x ->
let y = splitAt (div (length $ lines x) 2) $ lines x in
(writeFile "/tmp/foo.txt-part1" $ unlines $ fst y) >>
(writeFile "/tmp/foo.txt-part2" $ unlines $ snd y)
但你可以>> ..用>>= \_ -> ...
你也可以y變成模式匹配,但是要完全忠實于原來的你需要使用惰性模式~(a, b)
..
let (a, b) = splitAt (div (length $ lines x) 2) $ lines x in
writeFile "/tmp/foo.txt-part1" (unlines a) >>
writeFile "/tmp/foo.txt-part2" (unlines b)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/517132.html
標籤:哈斯克尔单子
