我的博客地址:鏈接
CHAPTER 4:函數(shù)式編程
使用 Haskell 思考
從命令式語言轉(zhuǎn)換到函數(shù)式語言上面來
一個(gè)簡(jiǎn)單的命令行程序
-- file: ch04/InteractWith.hs
import System.Environment (getArgs)
interactWith function inputFile outputFile = do
input <- readFile inputFile
writeFile outputFile (function input)
main = mainWith myFunction
where mainWith function = do
args <- getArgs
case args of
[input,output] -> interactWith function input output
_ -> putStrLn "error: exactly two arguments needed"
-- replace "id" with the name of our function below
myFunction = id
這是一個(gè)簡(jiǎn)單但完整的文件處理程序
當(dāng)我們需要測(cè)試其他函數(shù)的時(shí)候,我們就將程序中的 id 換成其他函數(shù)的名字。
循環(huán)的表示
fold、map以及filter
foldl帶來的棧溢出問題
匿名(lambda)函數(shù)
匿名函數(shù)各個(gè)方面的行為都和帶名稱的函數(shù)基本一致,但是,匿名函數(shù)的定義受到幾個(gè)嚴(yán)格的限制,其中最重要的一點(diǎn)是:普通函數(shù)可以通過多條語句來定義,而 lambda 函數(shù)的定義只能有一條語句。
部分函數(shù)應(yīng)用和柯里化
在 Haskell 中,所有函數(shù)都只接受一個(gè)參數(shù)。
As-模式
@符號(hào),模式 xs@(_:xs')被稱為 as-模式,它的意思是:如果輸入值能匹配 @符號(hào)右邊的模式,那么就將這個(gè)值綁定到 @符號(hào)左邊的變量中。
通過組合函數(shù)來進(jìn)行代碼復(fù)用
(.)操作符
*Main Data.List> :type (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
編寫可讀代碼的提示
盡量使用map 、 take 和 filter而不是折疊、顯式遞歸解決問題。
內(nèi)存泄漏和嚴(yán)格求值
foldl':左折疊的嚴(yán)格版本,它使用特殊的 seq函數(shù)來繞過 Haskell 默認(rèn)的非嚴(yán)格求值
seq:強(qiáng)迫(force)求值傳入的第一個(gè)參數(shù),然后返回它的第二個(gè)參數(shù)。