Basic Type
在每個程式語言中都會有一些基本的型態
Reason 屬於強型態的程式語言
這裡介紹的基本型態的變數型態有
- Boolean
- 數字
- 字串
- 字元
Type
Type 是 Reason 的亮點之一
let 不一定需要宣告 類型
1 | let score = 10; |
Reason 知道 score 是個 int 型別,透過其值 10 判斷出來。這個稱之為 推斷(inference)
變數宣告(Let binding)
在介紹變數型態之前要先介紹一下如何宣告變數
Reason 中只有使用 let 來宣告變數
1 | let a: string = "hello"; |
雖然在 Reason 中已經宣告,但是在編譯成功後依舊不會看到這個變數
因為當尚未使用到之前是不會產生在結果中
1 | let a: string = "hello"; |
但是當我們開始使用之後,編譯結果就會出現
Result:
1 | // Generated by BUCKLESCRIPT VERSION 4.0.5, PLEASE EDIT WITH CARE |
另外 Reason 是屬於 Block Scope
1 | if (displayGreeting) { |
也可以這樣處理
1 | let message = { |
這樣在外層會無法呼叫 part1, part2
而 message 會等於 part1 ++ " " ++ part2 的字串組合
編譯後的結果會是
1 | ; |
而且預設使用 let 宣告的變數都是 Immutable
1 | let a: string = "hello"; |
這邊會得到一個錯誤訊息
1 | >>>> Start compiling |
但是可以重複使用 let 宣告同一個變數
1 | let message = "hello"; |
Type system
雖然 Reason 是屬於強型態,但是也有留一些彈性
若你沒有宣告變數型態的時候,他會自動進行型態推導
1 | let a = "1"; |
但是如果使用數字的運算的話
1 | let a = 1; |
會得到了一個錯誤

訊息會相當清楚地告知是哪一個部分錯誤
對於 debug 會相當有利
Boolean
布林值在各個程式語言中佔有相當重要的基本判斷依據
而且在 Javascript 中也是一項令人相當頭痛的變數型態
常常會有很多不小心造成了很多 bug
1 | let testNum = 1; |
有趣的是編譯結果會是
1 | // Generated by BUCKLESCRIPT VERSION 4.0.5, PLEASE EDIT WITH CARE |
他並未依據我的順序來做編譯
而是做了一些優化
因為 isZero 比較的是一個常數
所以不論怎樣執行,最後的結果一定是 false
所以他優先宣告了 var isZero = false;
然後在宣告 testNum
基本的布林運算子
- && - and
- || - or
- ! - not
- <=, >=, <, >
- == - structural equal
- === - referential equal
- != - structural not equal
- !== - referential equal
運算子中比較有趣的是 == 和 ===
1 | let tuple1 = (1, 2, 3); |
== 是比較結構是否相等=== 是比較來源是否相同
數字
1 | let zero: int = 0; |
- int - 整數
- float - 浮點數
數字的相加
1 | let addResult = 1 + 1; |
Float 的相加要使用另外一個符號 +.
1 | let addResult = 1 + 1; |
int 與 float 的比大小
因為 Reason 是強型別的語言
1 | let twoBiggerThanOne = 2 > 1; |
int 和 float 是不同的型別
無法直接地做比較
所以要先使用 float_of_int 將 int 轉成 float
1 | float_of_int(2) > 1.2; /* true */ |
string
" 使用雙引號宣告的為字串
' 使用單引號宣告的為字元
字元只能有一個字母
1 | let name: string = "Tomas"; |
在編譯的時候要注意的是如果是中文的話預設是 Unicode
在宣告的時候要先進行處理
而使用 j 除了處理 Unicode 也可以用變數 (類似 ES6 Template)
1 | let name: string = "Tomas"; |
BuckleScript 編譯前會先尋找 js 和 j 進行處理
另外字串的相加使用 ++
1 | let hello = "Hello"; |
也可此參考 Reason 的 string API文件