【发布时间】:2013-02-17 03:01:59
【问题描述】:
smlnj 将重载运算符,比如 op + 默认使用 int,现在我想它返回一个真正的函数 * real -> real,我该怎么做内联方式?
“内联方式”的意思不是绑定一个新的val:
fun add(x:real,y:real) = x + y;
如果我的记忆是正确的,有一些语法允许 sml 它只是做一些类似“cast” op + to real 的事情,但我真的无法在任何地方找到它..
【问题讨论】:
smlnj 将重载运算符,比如 op + 默认使用 int,现在我想它返回一个真正的函数 * real -> real,我该怎么做内联方式?
“内联方式”的意思不是绑定一个新的val:
fun add(x:real,y:real) = x + y;
如果我的记忆是正确的,有一些语法允许 sml 它只是做一些类似“cast” op + to real 的事情,但我真的无法在任何地方找到它..
【问题讨论】:
您可以通过多种方式让 SML 键入 op+ 作为真正的对应项。
取决于你有什么代码,
您可以按照建议,键入注释周围的函数,从而强制op+ 的参数为实数类型。
由于您不固定加法函数(大概是用作高阶函数?),您也可以从真实模块Real.+传递加法函数@
或者你可以这样注释它:op+ : real * real -> real,考虑到你可以使用Real.+,这真的很丑陋和愚蠢。但这是一种选择。
【讨论】:
如果运算符的默认实例不是您的值类型所需的实例,您可以在操作数上使用类型注释来强制执行所需的类型。
例如,虽然
val f = fn a => a + a
将输入int -> int,这个值
val g = fn a:real => a + a
将输入real -> real。
【讨论】:
你可以声明
open Real
在您定义函数的范围内,但我强烈建议不要这样做。对函数进行类型注释是最好的方法。您不必注释每个参数,顺便说一句,做一个就足够了,或者在这种情况下,甚至是返回类型:
fun add(x : real, y) = x + y
fun add(x, y) : real = x + y
【讨论】: