天天看點

haskell學習筆記(9)-再談模式比對

我們在寫一個函數時,有一個很通用的步驟,即從傳入的參數中進行一些預處理,比如從對象中取出某個屬性,然後聲明一些局部變量。

例如将一個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

繼續閱讀