大家好,我們先來複習一下昨天寫的 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"
這樣就好看多了!
(發現字數足夠,又水了一天)