1. 程式人生 > 實用技巧 >F# 函數語言程式設計之 - 一個例子

F# 函數語言程式設計之 - 一個例子

經過本系列前面幾篇文章對 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# 函數語言程式設計的美味。