参数值(不是类型)的多态性?

ts.*_*ts. 4 language-agnostic polymorphism programming-languages language-design

是否存在编程语言(可能是概念或研究论文),它允许对函数/方法参数值进行多态化?的种类:

function factorial(int value > 0){ /* code here */}
function factorial(int value == 0){ /* code here */}
function factorial(int value < 0){ /* code here */}
Run Code Online (Sandbox Code Playgroud)

而且,这种多态性的官方名称(如果有的话)是什么?

dec*_*eze 8

我想你要找的是模式匹配和/或警卫.例如Erlang允许这样:

foo(X) when X > 0  -> bar(X);
foo(X) when X == 0 -> baz(X);
foo(X)             -> X.

foo("bar", X) -> bar(X);
foo(42, X)    -> baz(X);
foo(_, X)     -> X.
Run Code Online (Sandbox Code Playgroud)

前者说明了如何使用警卫的,后者是一个简单的模式匹配,其中第一个参数是要么"bar",42或其他任何东西.这两种技术都可以在许多函数语言中找到.

如果你不熟悉语法,那就相当于(尽可能多的比较):

function foo("bar", x) {
    return bar(x);
}
function foo(42, x) {
    return baz(x);
}
...
Run Code Online (Sandbox Code Playgroud)

  • +1,但应该注意的是,与通常称为多态的技术不同,模式匹配不允许您"在事后"添加案例.也就是说,如果定义一个函数,其中一个正整数和一个正整数,则不能在另一个文件/编译单元中为负数添加第三个案例. (2认同)