我不太知道expression 在中文要怎麼翻?叫做表達式好了。在elm或是其他functional programming 的世界裡,沒有什麼物件的概念,你可以想成全部的東西都是表達式。而表達式會被elm判讀成一個數值。
expression | evaluate |
---|---|
"hello " ++ "world" | "hello world" |
2^2 | 4 |
13 | 13 |
在elm的世界裡,條件式的寫法只有一種,叫 if...then...else
。沒了。 注意沒有 "truthiness" 這種事,也沒有像js 裡的 else if。
if (condition1)
statement1
else if (condition2)
statement2
else if (condition3)
statement3
上述的例子在elm要寫成:
if (condition1) then
statement1
else (if condition2 then statement2)
else (if condition3 then statment 3)
else
statement4
而在javascript 裡condition 可以是"hello world"單一的string 或是數字;而在elm 裡面, if
之後只能是 Bool(也就是true or false)
耶,終來來到functional programming 最重要的function了。我們來寫一個function吧。你可以在elm-repl上試試,
> isHello word = if word == "hello" then "hello" else "hey, buddy"
<function> : String -> String
> isHello "god"
"hey, buddy" : String
> isHello "hello"
"hello" : String
每個expression 都會有 Type
,之後我們再詳談,你輸入一個expression,如果你沒有定義 Type
, elm 會幫你推測你的 Type
是什麼。 我們的 isHello
是我們定義的 function 名稱,接著 空一格 的 word
是我們要輸入的值,在 =
之後,就是我們要這個 function 做得事情。整個function,就像是小時候上數學課 f(x) = a x + b
,是不是一樣!
什麼時候要用 let
來建立 local scope
呢? 請看以下例子
pluralize singular plural quantity =
if quantity == 1 then
toString quantity ++ " " ++ singular
else
toString quantity ++ " " ++ plural
pluralize singular plural quantity =
let prefix =
toString quantity ++ " "
in
if quantity == 1 then
prefix ++ singular
else
prefix ++ " " ++ plural
你看,這樣是不是就不用要兩次 tostring quantity ++ " "
很多時候,function 可以當成一個值被傳入,但你不想要替它在取一個名字,我們只是要用而已。那怎麼辦?
> \ w x y -> w + x +y
<function> : number -> number -> number -> number
我們用了三個值 w, x, y 讓他們相加。不過因為是沒有命名的,之後要呼叫就不太能叫。但如果你要定義一個functions, 裡頭的值是另外一個function, 這種時候,我們常常就會用anonymous function。
到這裡,你就懂了,function 就是空一格代入值,everything is a kind of function。那 1 + 1
呢? 怎麼辦?怎麼會這樣?,你答對了。不信你輸入: (+) 1 1
,答案也一樣對不對?我們常用的 function , 是prefix function, 而這類的 加減乘除,我們叫 infix
也就是說可以放在輸入值的中間,如果要放到前面,就要加個刮號 ()
,不信你來看 elm-doc 裡的定義:
(+) : number -> number -> number (-) : number -> number -> number (*) : number -> number -> number