iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 20
0

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 的法則:

  1. 封閉律
  2. 結合律

第一段看起來像是要實作一個叫 Semigorup 的 typeclass,需要做出 <> 這個函式,它的型別是 a -> a -> a,所以是接受兩個值,回傳一個值的函式。

第二段的法則…封閉律跟結合律…好像在哪裡聽過的樣子…




我們要先回到……數學。很簡單的,國小程度的數學。我們先來再來思考一次整數,以及加法。首先我們要知道加法是一種二元運算:把兩個整數相加,會得到一個結果。

整數的加法符合以下幾條規則:

  1. 封閉律
    任何兩個整數相加,其結果也是整數

  2. 結合律
    三個整數相加時,先相加左邊兩個,最後再加上右邊的,其結果等同於先相加右邊兩個,最後再加上左邊的。

    Equation 其結果等同於Equation

Equation


抽象

接下來我們要把上面的說法抽象一層。也就是"整數",跟"加法運算"都抽象出來。先想像一下,有一堆同類的東西,然後有一種作用在這類東西上的二元運算。為了比較好理解,我們把這類的東西稱為 Equation,並且把這個二元運算用 Equation 表示。接著從 Equation 裡隨便挑幾個成員,假設我們挑到 Equation 這幾個。

在想像的過程中,你可以試著對應整數的例子, Equation 就是所有的整數, Equation 就是 Equation 這種真正的數字。而二元運算 Equation 就是 Equation

那麼這類東西要符合這些規則:

  1. 封閉律
    任兩個 Equation 的成員,例如 EquationEquation,那麼 Equation 的結果也會是 Equation 的成員。

  2. 結合律
    任三個 Equation 的成員,例如 EquationEquationEquation,要把他們 Equation 在一起時,先算哪兩個沒有差別。也就是:

Equation

符合這兩條法則的,我們稱之為 Semigroup (半群)




所以這麼說來,整數就是 Semigroup 的一種囉?我試著在附近找到一些整數,丟進門上的缺口裡。

沒有反應。

為什麼?

[to be continue]


上一篇
mostly:functional 第十八章:不同事物的相同部份
下一篇
mostly:functional 第二十章:Semigroup 的實體
系列文
mostly:functional 從零開始的異世界程式觀 --- 函數式程式設計的試煉35
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
taiansu
iT邦新手 3 級 ‧ 2025-10-05 06:10:44

chart.googleapi 終止運作。找到方法修 Equation 了。好辛苦啊 XD

我要留言

立即登入留言