smlnj 将使重载运算符,如 op + 默认使用 int,现在我想它返回一个真正的函数 * real -> real,我该怎么做内联方式?
“内联方式”意味着不像绑定一个新的val:
fun add(x:real,y:real) = x + y;
如果我的记忆是正确的,那么有一些语法允许 sml 它只是做一些类似“cast” op + 到真实的事情,但我真的无法在任何地方找到它..
有多种方法可以让 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