你通過編程以不必要的方式讓生活變得困難。您使用美麗的Haskell語言進行編程,並且您正在尋找goto
結構!
爲什麼不只是import Control.Applicative (<$>)
寫
readAndChange' = writeFile "couples.txt" =<<
unlines.map (show.extractNameAndId).lines <$> readFile "deletedId.csv"
(是啊,這幾乎是一個需要一行代碼。這是在清潔,實用的風格,整潔的讀取和寫入行的機制。儘可能的處理是在純代碼完成,僅輸入和輸出是基於IO)
說明:
這裏unlines.map (show.extractNameAndId).lines
通過切碎我處理您輸入t分爲行,將extractNameAndId
然後show
應用於每個使用map
,然後再將它們與unlines
再次連接在一起。
unlines.map (show.extractNameAndId).lines <$> readFile "deletedId.csv"
將讀取該文件並應用處理功能。對於fmap
,<$>
是令人愉快的語法。
writeFile "couples.txt" =<< getanswer
與getanswer >>= writeFile "couples.txt"
相同 - 如上獲得答案,然後將其寫入文件。
試着寫greet xs = "hello " ++ xs
然後在ghci中做這些的樂趣
greet "Jane" -- apply your pure function purely
greet $ "Jane" -- apply it purely again
greet <$> ["Jane","Craig","Brian"] -- apply your function on something that produces three names
greet <$> Just "Jane" -- apply your function on something that might have a name
greet <$> Nothing -- apply your function on something that might have a name
greet <$> getLine -- apply your function to whatever you type in
greet <$> readFile "deletedId.csv" -- apply your function to your file
最後一個是我們如何在readAndChange
使用<$>
。如果有大量的數據在 deletedId.csv你會錯過打招呼,當然,你可以做
greet <$> readFile "deletedId.csv" >>= writeFile "hi.txt"
take 4.lines <$> readFile "hi.txt"
看到的第4行。
因此$
可以讓你在你給它的參數上使用你的函數。 greet :: String -> String
所以,如果你寫greet $ person
,該person
必須是String
類型,而如果你寫greet <$> someone
,該someone
可以是任何產生String
- 字符串列表,一個IO String
,一個Maybe String
。從技術上講,someone :: Applicative f => f String
,但你應該先閱讀類型類和Applicative Functors。瞭解你對Haskell的好處是一個很好的資源。
爲了更有趣,如果您有一個以上參數的函數,您仍然可以使用可愛的Applicative風格。
insult :: String -> String -> String
insult a b = a ++ ", you're almost as ugly as " ++ b
嘗試
insult "Fred" "Barney"
insult "Fred" $ "Barney"
insult <$> ["Fred","Barney"] <*> ["Wilma","Betty"]
insult <$> Just "Fred" <*> Nothing
insult <$> Just "Fred" <*> Just "Wilma"
insult <$> readFile "someone.txt" <*> readFile "someoneElse.txt"
在這裏,你需要的參數之間的功能和<*>
後使用<$>
。它的工作原理首先是令人興奮的,但它是編寫有效計算的最實用的風格。
下一個閱讀關於Applicative Functors。他們很棒。
http://learnyouahaskell.com/functors-applicative-functors-and-monoids
http://en.wikibooks.org/wiki/Haskell/Applicative_Functors
令人驚歎的:)你可以猜到我是一個哈斯克爾新手;如果'$'和'<$>'之間有任何區別,你能解釋我嗎? – Aslan986
@ Aslan986我現在增加了一點。 – AndrewC
不可能不接受你的回答。非常感謝Andrew。 – Aslan986