我們在寫一個函數時,有一個很通用的步驟,即從傳入的參數中進行一些預處理,比如從對象中取出某個屬性,然後聲明一些局部變量。
例如将一個Point類的xy屬性相加,我們一般會這樣寫(不用考慮此函數本身的意義了…)
public double add(Point p)
{
int x=p.x;
int y=p.y;
return x+y;
}
雖然直接return p.x+p.y也可以,但總歸是要有一個從對象中取資料的過程。
haskell的模式比對,基本上就是将這個取資料的過程大大簡化,直接将他們聲明成參數了
--等價的haskell
pointAdd (Point x y) = x+y
然後還可以比對直接量
下面這個在指令式語言裡基本上就是一個switch
sayMe :: (Integral a) => a -> String
sayMe = "One!"
sayMe = "Two!"
sayMe = "Three!"
sayMe = "Four!"
sayMe = "Five!"
sayMe x = "Not between 1 and 5"
有人可能覺得這樣寫莫名其妙,其實這主要因為haskell是一個函數式的語言,将switch的幾條判斷,拆成多個函數,總之就是函數分的越細越好,越細越靈活,你就把haskell裡的函數當成至高無上的一個存在就行了,整個語言都是圍着函數轉,是以能用多條函數寫的時候,盡量不要用其他結構寫(否則你還來學haskell幹嘛啊)
haskell裡的 _ 占位符基本上和python,lua,go裡的差不多,唯一注意的就是他是比對任意參數的,是以如果有個帶 的函數寫在最前面(如果一個全帶 的函數寫在最頂端,那他基本上就是錯的),就需要注意他會不會覆寫後面的比對。
歡迎關注我的github
https://github.com/luckyCatMiao