iT邦幫忙

2023 iThome 鐵人賽

DAY 30
2
Software Development

Haskell 從入門到放棄系列 第 30

[Haskell 從入門到放棄] Day 30 - 開始也是結束

  • 分享至 

  • xImage
  •  

終於寫到最後一天了,今天就輕鬆一點吧xD。

首先感謝所有讀者,在開賽前就有心理準備這個題材本來就是屬於比較冷門領域所以應該沒什麼人關注,本來以為可能完全沒有回饋就默默地完賽,但發現收到回覆比預期中的多一點點 xD。

特別是 shootingstar 大大給予蠻多補充以及很多有意義的討論。

總結

這將近一個月的時間我們從 Haskell 的基本語法到了十分抽象的 monad,其實我也是這一個月才比較心力在學習 Haskell ,其中我最大的收穫是更加理解 FP (當然我還不敢說我懂了)以及改變我對於寫程式想法,以下是我覺得比較重要的概念。

algebra data type

在這之前我都會認為 type 就只是一種語法,但因為 ADT 現在我覺得 type 可以是更佳靈活的概念,可以組合、可以 partial apply 、可以遞迴。

typeclass

雖然大多數時候我會用 interface 來思考這件事情,但它的抽象是在型別之上,我們大部分時候確定一個型別後也相當確定它能做哪些事情了。但因為有 typeclass 我們可以只規範它能有哪些行為,但它實際上在什麼 type 下要怎麼運算又是另外的事情。

但如果是用我們OOP語言的 interface 或是 abstract class 之類的語法的話,通常我們是可以替不同的 class 實作同一個 interface 藉此來抽象同樣意義但在不同 class 需要不同實作的 function (method)或者 field 。

打個預防針我對於 OOP 非常的不熟,只有短暫寫過 dart 及以前稍微學過 java ,所以這只是一個非常簡略地說明 interface 、abstract class 的作用。

相較之下 typeclass 就更加靈活了,因為我們抽象的是 Ord+ 之類的行為,像是小於這件事情就必許長這樣 (<) :: a -> a -> Bool ,它必須傳入兩個參數最後回傳 Bool 但在不同型別中怎麼比較完全是可以自己實作的。

但也有可能是 Haskell 的型別系統才能夠很好的運用上述的抽象特性,畢竟我也沒寫過其他 FP 語言。

monad & functor

這兩個我一直以來都還無法搞懂(現在也不敢說真的懂)的概念,經過這次我只能說我好像能夠稍微理解為什麼需要這樣子的概念,特別是 monad 這個感覺很難說明但又四處可見的概念 ,我是認為不是因為實作了它所以叫 FP ,而是因為是 FP 才需要實作它,如果本來的語言就對 side effect 的存在很寬容的話感覺不必做那麼麻煩的抽象。

總而言之,藉由 Haskell 來學習 FP 讓我知道這些抽象概念是為了在純粹的 FP 實作更有彈性的程式或者方便我們在 pure 裡做 impure 的事情,所以回過頭來看自己常用的 js ,會發現這些概念還是有助於我們用另外一些角度來看我們已經做習慣的事情,

雖然 promise 不能說是 monad,但我們一樣可以這個概念來重新理解 promise ,一樣是用一個 context 來處理 side effect ,一樣有提供一些方式讓我們包裝一個值進去 context ,也提供一些方法讓我們解開 context 或者鏈式的調用。

至於 promise 為什麼不能算是 monad ,是因為它並沒有符合 monad law ,有興趣的讀者可以自己思考看看xD

那下一步呢?

這個系列文終究只是一個入門的系列文不管是 Haskell 或者 FP 都有更多可以學習的部分,以下推薦幾個感覺還不錯的學習資源供大家參考。

首先是我在這一個月學習中最常閱讀的資料

  1. Learn You a Haskell for Great Good
  2. Real World Haskell
  3. https://openhome.cc/zh-tw/haskell/ (QQ ,良葛格惠我良多)
  4. Haskell for Imperative Programmers

其他我還沒讀完,但覺得還不錯的學習資料:

  1. Haskell 相關

    1. https://github.com/bitemyapp/learnhaskell/blob/master/guide-zh_tw.md
      Haskell 的學習指南
    2. Advanced Functional Programming in Haskell
      講解一些進階語法的 YT 播放清單
  2. FP 概念

    1. Functional Programming with TypeScript
    2. Brian Beckman: Don't fear the Monad
  3. category theory

    特別說一下好了,在這個系列文後期蠻常提到某些概念是為了符合數學上的定義,而所謂數學上的定義大部分都是來自於 category theory 這個數學分支了,當然就開發軟體本身我相信應該不太需要真的很熟 category theory ,但如果不排斥數學而且也想了解這些概念背後的定義的話是可以研究看(雖然我自己也還沒讀)

    1. A Sensible Introduction to Category Theory
    2. The Mathematician's Weapon | An Introduction to Category Theory, Abstraction and Algebra
    3. Category Theory

感想與其他廢話

雖然說我接觸 FP 大概有三年了,但這期間大部分時候都是在似懂非懂地在使用這些概念或工具。最早是從 loadsh/fp (一個 js library)的,後來才發現在類似用途的工具上 ramda 比較 FP 一點,簡單的比較差異的話就是 ramda 都是默認 curried 以及它所提供的 function 都是單一功能的,但那時也只想說好像這樣子就像是有 FP 的感覺並沒有深究為什麼要這樣設計。

簡單的結論就是這樣子可以讓我們更簡單地實作 function composition

隨著時間推移總是會好奇為什麼要這麼做,所以就開始研究 FP 到底是什麼以及怎麼實踐,後來加入了一個熱愛 FP 的團隊就接觸了比較多這方面的知識了,還記得那時的 training 期間有一個目標是是看完一個 YT 播放清單,主要內容就是用 JS 教學 FP 的概念。

那時才知道 side effect 、higher-order function 、pure function、immutable 這些在前端也十分常見及實用的概念。

shout out to 我的前主管同時也是我在學習 FP 路上的引路人 jacky。

也是因為這樣才第一次接觸到 monad 以及 functor ,雖然那時好像理解就是可以分離 impure 與 pure 的 context 以及可以被 map 的形式,但感覺在 JS 實作這兩者好像也沒什麼特別的好處。

然後這些疑惑就埋在心裡直到最近才想說來花點心力學習看看好了,最早也不打算從 Haskell 開始畢竟真的太難了,本來想說從眾多 FP 語言(像是 Elixir、Ocaml、PureScript 之類的)挑一個學習,但後來比來比去終究還是覺得從 Haskell 或許是最直接學習 FP 的路徑了。

總之蠻慶幸自己有做完這件事情,雖然之於 FP 我還算是一個初心者但感覺我現在已經對於以前感到疑惑的概念開始覺得有變得更清晰一點了。

接下來我應該會把這些文章整理一遍然後 PO 到我的 blog ,如果對於我之後研究的東西感到有點興趣或者是有其他回饋也可以追蹤我的 X (twitter) 。

畢竟有時候為了趕12點 PO 文所以部份文章品質說真的蠻水的xD

再次感謝大家的閱讀~

blog : Todd's Dev Logs

X: https://twitter.com/toddLiao469469


上一篇
[Haskell 從入門到放棄] Day 29 - Monad (6)
系列文
Haskell 從入門到放棄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言