F# 函数式编程之 – 一个例子

  • A+
所属分类:.NET技术
摘要

经过本系列前面几篇文章对 F# 的介绍,是时候来一个比较小巧的例子了。这个例子的原文见 https://fsharpforfunandprofit.com/posts/roman-numerals/

经过本系列前面几篇文章对 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# 函数式编程的美味。