假设我有一个声明如下的函数:
fun foo(x: int, y: bool): string
我想写foo(x)
来表示foo(x, false)
。有办法吗?
在ATS中支持这个吗?
答案 0 :(得分:1)
我猜你可以这样做:
fun foo_full (x:int, y:bool): string = ... // your function, renamed
fun foo_def (x:int): string = foo_full (x, false)
overload foo with foo_full
overload foo with foo_def
此功能称为符号重载。 foo
是一个符号(由第一个overload
声明隐式引入),它可以代表两个不同的函数。
答案 1 :(得分:0)
一种可能性是使用模板。例如,
fun{} foo$y(): bool
fun{} foo(x: int): bool
implement{} foo$y() = false
implement{} foo(x) = let val y = foo$y() in ... end
这实际上比简单地支持函数参数的默认值更灵活。例如,foo $ y可以在以后重新实现:
implement{} foo$(y) = true
更重要的是,foo $ y可以在调用foo的函数体中实现:
fun bar(...) = let
implement foo$y() = ...
in
...foo(...)...
end // end of [bar]