- A+
所属分类:.NET技术
经过本系列前面几篇文章对 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# 函数式编程的美味。