Haskell筆記 (五) 高階函式

2021-06-16 13:03:14 字數 1505 閱讀 6776

了解高階函式

高階函式是haskell的重要性質,同時也是所有函式式語言的共同性質,高階函式實際上就是函式的函式,就是把某個函式作為另乙個函式的引數的形式,就是高階函式。

還是來看個例子吧,取乙個函式並呼叫它兩次的函式 ,用數學表示式表達出來就是 f(f(x)),而在haskell中寫函式其實和數學上的表示式非常接近,這也是為什麼說haskell更加接近數學的原因。

(a->a)表示第乙個引數是乙個函式,這個函式輸入是a型別,輸出也是a型別,第二個引數a表示第二個引數是個變數,然後這個函式輸出也是個變數。

表示,(10+3)+3,其中f(x)=x+3,所以f(f(x))=x+3+3。

當然,我們也可以來乙個複雜一點的,這裡就使用了匿名函式了。

這裡,括號裡面的就是匿名函式,這個概念應該大家都不陌生了吧,實際上整個函式就是 f(f(x))=(x^2+3)^2+3。

map和 filter

map和filter也是函式式程式設計中的重要組成部分,並且這個概念已經被很多命令列的程式語言所接納了,比如python中就有這兩個概念。

map就是從一組list中挨個取出元素,並把元素都執行指定的函式,然後生成一組新的list。

比如我們有一組list,[1,2,3,4,5,6],我需要將他們都平方以下,按照之前的做法,我們可以這麼寫:

[x^2 | x<-[1,2,3,4,5,6]]
如果我們用map的形式,可以這麼寫:

map (\x->x^2) [1,2,3,4,5,6]
這就是map,和上面的寫法完全等價,但是顯得更加明朗一些。

fliter是輸入引數是乙個限制條件和乙個 list,回傳該 list 中所有符合該條件的元素。

比如我們要再一組list中找到大於3的所有數,按照之前的寫法,我們可以這麼來:

[x | x <-[1,2,3,4,5,6],x>3]
同樣,如果用filter,可以這麼寫

filter (>3) [1,2,3,4,5,6]
map和filter是函式式程式設計的重要思想和方法,已經被借鑑到很多語言中,所以得認真掌握哦。。

函式組合

函式組合,實際上是乙個簡寫函式的方式,比如乙個list xs,我們需要依次呼叫a,b,c三個函式,那麼我麼可以這麼寫c.b.a xs,實際上表示c(b(a xs))

匿名函式

匿名函式我們就不具體說了,上面我們已經開始使用了,他的一般形式是:

本教程參考了

《haskell趣學指南》

,是這篇指南的學習筆記,不過參入了我自己的一些想法和總結,首先,感謝《haskell趣學指南》的作者

bonus

和大陸翻譯者

fleurer

和台灣翻譯者

mno2

,謝謝你們之前的工作。

Haskell學習筆記 Monads

monads 翻譯叫 單子 或者 乙個自函子上的么半群 好吧除了讓人費解沒有什麼用 同樣舉乙個書上的例子 data expr val int div expr expr eval expr maybe int eval val n pure n eval div x y pure safediv e...

Python筆記(五) 變數 遞迴與高階函式

區域性變數與全域性變數 高階函式 遞迴 在函式內部,可以呼叫其他函式。如果函式在內部呼叫自身本身,則這個函式就是遞迴函式 遞迴特性 1 必須有明確結束條件 2 最大遞迴999層 3 每次進入更深遞迴時,問題規模應比上次遞迴少 4 遞迴效率不高,遞迴層次過多會導致棧溢位 遞迴 defcalc n pr...

python基礎學習筆記(五)裝飾器,高階函式

import multiprocessing def process1 return 1 def process2 return 2 p1 multiprocessing.process target process1 p2 multiprocessing.process target proces...