【发布时间】:2016-03-23 09:03:11
【问题描述】:
我找到了 Don Syme 的 presentation,它表明 Erlang 的
fac(0) -> 1
fac(N) -> N * fac(N-1).
相当于F#的
let rec fac = function
| 0 -> 1
| n -> n * fac (n-1)
但看起来没有办法在不丢失类型安全的情况下将模式匹配用于不同的数量。例如。可以使用列表模式匹配,但类型必须是通用基本类型(例如object):
let concat = function
| [x;y] -> x.ToString() + y.ToString()
| [x] -> x.ToString()
鉴于模块中的 F# 函数不支持重载,看来使用静态类型将 Erlang 代码重写为 F# 的唯一方法是使用具有方法重载的静态类而不是模块。有没有更好的方法在 F# 中重写具有不同数量的 Erlang 函数?
一般来说,说 Erlang 的参数匹配更接近 .NET(包括 C#)的方法重载而不是 F# 的模式匹配是否正确?或者两者之间没有直接替代,例如Erlang 中可能有一个具有不同元数的函数 + 一个守卫:
max(x) -> x.
max(x,y) when x > y -> x.
max(x,y) -> y.
max(comparer, x, y) -> if comparer(x,y) > 0 -> x; true -> y end.
在最后一种情况下,参数是不同的类型。你会如何用 F# 重写它?
【问题讨论】: