F# 函數語言程式設計之 - 一個例子
阿新 • • 發佈:2020-12-08
經過本系列前面幾篇文章對 F# 的介紹,是時候來一個比較小巧的例子了。
這個例子的原文見 https://fsharpforfunandprofit.com/posts/roman-numerals/
將羅馬數字轉換成普通的十進位制數字,完整程式碼如下:
module Roman = type Digit = I | V | X | L | C | D | M type Numeral = Numeral of Digit list let digitToInt = function | I -> 1 | V -> 5 | X -> 10 | L -> 50 | C -> 100 | D -> 500 | M -> 1000 let rec digitsToInt = function | [] -> 0 | x::y::tail when x < y -> (digitToInt y - digitToInt x) + digitsToInt tail | digit::tail -> digitToInt digit + digitsToInt tail let print digits = digits |> digitsToInt |> printfn "%A"
非常優雅,非常簡潔、清晰,可讀性強,易擴充套件易維護,沒有變數,不用管理狀態,函式沒有副作用,不容易出錯,而且型別安全,可進行靜態型別分析。
上面是一個模組,可以這樣使用它:
open type Roman.Digit
Roman.print [I;I;I;I] // 4
Roman.print [I;V] // 4
Roman.print [V;I] // 6
Roman.print [I;X] // 9
[M;C;M;L;X;X;I;X] |> Roman.print // 1979
[M;C;M;X;L;I;V] |> Roman.print // 1944
本文介紹了一個比較完整的例子,它像一個小點心,希望你也能和我一樣初嘗 F# 函數語言程式設計的美味。