Something is elegant if it is two things at once: unusually simple and surprisingly powerful.
兼備異常簡潔、意外強大者,可謂之優雅。-- Matthew E. May, In Pursuit of Elegance
-- 0821
上次從標示著 class 的建築出來後,外面的天色明顯比之前亮很多,不再像是沒什麼光線的夜晚,而是像清晨太陽正要昇起的感覺。
為什麼要那麼刻意的引導我去那棟建築呢?我想了很久。
-- 0825
我忽然有種感覺,會不會是因為…Monad 是…一種 typeclass?帶著這個想法,我往牆那邊走。但離牆還有一段距離地方,我看到有一群之前還只有輪廓的建築,現在看起來都變得比較…具體一點了。其中有一棟最為明顯,門楣上面的標示是… <>
。啊,這個我有印象。
再靠近建築一些,就發現那塊金屬板就飄浮在門的前方。那麼下一站應該就是這裡了,我看到金屬板上,寫著這些文字:
Semigroup 的實作:
class Semigroup a where (<>) :: a -> a -> a {-# MINIMAL (<>) #-}
Semigroup 的法則:
- 封閉律
- 結合律
第一段看起來像是要實作一個叫 Semigorup 的 typeclass,需要做出 <>
這個函式,它的型別是 a -> a -> a
,所以是接受兩個值,回傳一個值的函式。
第二段的法則…封閉律跟結合律…好像在哪裡聽過的樣子…
我們要先回到……數學。很簡單的,國小程度的數學。我們先來再來思考一次整數,以及加法。首先我們要知道加法是一種二元運算:把兩個整數相加,會得到一個結果。
整數的加法符合以下幾條規則:
封閉律
任何兩個整數相加,其結果也是整數
結合律
三個整數相加時,先相加左邊兩個,最後再加上右邊的,其結果等同於先相加右邊兩個,最後再加上左邊的。
其結果等同於
接下來我們要把上面的說法抽象一層。也就是"整數",跟"加法運算"都抽象出來。先想像一下,有一堆同類的東西,然後有一種作用在這類東西上的二元運算。為了比較好理解,我們把這類的東西稱為 ,並且把這個二元運算用 表示。接著從 裡隨便挑幾個成員,假設我們挑到 這幾個。
在想像的過程中,你可以試著對應整數的例子, 就是所有的整數, 就是 這種真正的數字。而二元運算 就是 。
那麼這類東西要符合這些規則:
封閉律
任兩個 的成員,例如 跟 ,那麼 的結果也會是 的成員。
結合律
任三個 的成員,例如 跟 跟 ,要把他們 在一起時,先算哪兩個沒有差別。也就是:
符合這兩條法則的,我們稱之為 Semigroup (半群)。
所以這麼說來,整數就是 Semigroup 的一種囉?我試著在附近找到一些整數,丟進門上的缺口裡。
沒有反應。
為什麼?
[to be continue]