iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0
Modern Web

從零開始的 Purescript系列 第 3

[Day 3] 從看懂 Hello world 開始

  • 分享至 

  • xImage
  •  

大家好,我們先來複習一下昨天寫的 hello world:

main :: Effect Unit
main = do
  log "?"

如果有接觸過其他 functional programming language 的話,會發現這 syntax 跟 haskell 很像。實際上 purescript 和 haskell 有非常多相似的地方,會寫 haskell 的人要上手 purescript 是非常簡單的。反過來說,學習 purescript 也可以作為入門 haskell 的其中一個方法。畢竟 purescript 能用來寫 web frontend,對於前端開發者來說入門門檻應該是比較低的。

那麼回到我們的 hello world,這段 code 可以拆分為三部份:

-- type declaration: main 這個 function 的 type 是 Effect Unit
main :: Effect Unit
-- function definition: 定義 main 這個 function 的內容
-- function 內容為 = 後面的東西
main = do
  log "?"

到這裡應該會有人問:

log 很明顯是 console.log,但 do 這個字是什麼呢?

這位同學問得好,如果大家把這個東西拿去丟 Google 的話,大槪會跑出一些 Monad 什麼什麼monad is just a monoid in the category of endofunctors 之類艱深的話,如果剛剛入門的初心者,個人非常不建議繼續深入了解。非常簡單地說的話,do 就只是一個 syntax 而已。首先,do 在上面的 hello world 是可以拿掉的:

main :: Effect Unit
main = log "?"

好,但如果我們想印兩行,例如⋯ 再加一行 Hello world 呢?

main =
  log "?"
  log "Hello world"
-- [1 of 1] Compiling Main
-- Error found:
-- in module Main
-- at src/Main.purs:10:8 - 10:19 (line 10, column 8 - line 10, column 19)
-- 
--   Could not match type
--           
--     Effect
--           
--   with type
--                                     
--     Function (String -> Effect Unit)
--                                     
-- 
-- while trying to match type Effect Unit
--   with type (String -> Effect Unit) -> t0
-- while inferring the type of (log "?") log
-- in value declaration main
-- 
-- where t0 is an unknown type
-- 
-- See https://github.com/purescript/documentation/blob/master/errors/TypesDoNotUnify.md for more information,
-- or to contribute content related to this error.

當然這麼愚蠢的嘗試是肯定會失敗的,因為在 purescript 裡面是不存在 statement 這個槪念的。Statement => statement 之間存在 state (context) => 不是 purely functional。我們需要用 >>= 把兩個 Effect 串在一起:

main :: Effect Unit
main = log "?" >>= (\_ -> log "Hello world")

想當然爾,如果我們要多印幾行的話,這串就會變得又長又難看,而碰巧這個場景又常常出現,所以就誕生了 do:

main :: Effect Unit
main = do
  log "?"
  log "Hello world"

這樣就好看多了!

(發現字數足夠,又水了一天)


上一篇
[Day 2] 安裝 purescript compiler 和 package manager
下一篇
[Day 4] 該寫點 SPA 了
系列文
從零開始的 Purescript8
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言