我是 Haskell 的新手,我現在正在youtube 上觀看“Haskell Rank”系列,我覺得我需要更好地了解第一個視頻中發生的事情,以便我可以繼續前進。
他從hackerrank上的基本“先解決我”練習開始,該練習已經附帶了解決方案:
solveMeFirst a b = a b
main = do
val1 <- readLn
val2 <- readLn
let sum = solveMeFirst val1 val2
print sum
很明顯,如果我把它放在一個檔案中,編譯它并運行它,它會按預期運行:
- 需要兩行輸入
- 列印來自用戶輸入的數字的總和
通過幾個步驟解釋每個功能的作用,他得到了一個功能更強大的單線解決方案;
他首先完成以下作業:
> show $ sum $ map read $ words "1 2"
3
到這里為止,我明白了一切,包括 ($) 運算子的使用。
最后,他定義了 main 函式,interact用于處理來自的輸入stdin,有兩件事我真的不明白:
1 - 函陣列合:然后他得到以下解決方案:
main = interact $ show . sum . map read . words
在那里他抓住了以前的構建,洗掉了輸入"1 2"以組合將成為 的引數的函式interact。而且,他沒有徹底解釋的是“并用功能組合替換其所有美元符號”。
希望詳細解釋逐步執行此“反轉”程序。
2 - 使用這個單行解決方案,并從一個檔案編譯它,
我如何運行檔案,將輸入發送為args?
uj5u.com熱心網友回復:
向組合的轉換基于.運算子的簡單定義(此處顯示$用于使鏈接清晰)。
(.) f g = \x -> f $ g x
show . sum . map read . words與 相同\x -> show $ sum $ map read $ words x。
組合函式永遠不會顯式應用于引數,因為interact接受該函式并產生一個IO ()值,當由運行時執行時,該值會將函式應用于同樣由運行時提供的引數。
運行時通過從標準輸入讀取來提供輸入。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/355865.html
上一篇:使用復雜型別引數強制記錄的問題
