1

smlnj 将使重载运算符,如 op + 默认使用 int,现在我想它返回一个真正的函数 * real -> real,我该怎么做内联方式?

“内联方式”意味着不像绑定一个新的val:

fun add(x:real,y:real) = x + y;

如果我的记忆是正确的,那么有一些语法允许 sml 它只是做一些类似“cast” op + 到真实的事情,但我真的无法在任何地方找到它..

4

3 回答 3

3

有多种方法可以让 SML 键入op+作为真正的对应项。

根据您拥有的代码,

  • 您可以按照建议,键入注释周围的函数,从而强制参数为op+实数类型。

  • 由于您不固定加法函数(可能用作高阶函数?),您也可以从真实模块传递加法函数Real.+

  • 或者你可以像这样注释它:op+ : real * real -> real,考虑到你可以使用它,这真的很丑陋和愚蠢Real.+。但这是一种选择。

于 2013-02-18T13:47:54.613 回答
0

如果运算符的默认实例不是您的值类型所需的实例,您可以在操作数上使用类型注释来强制执行所需的类型。

例如,虽然

val f = fn a => a + a

将被输入int -> int,这个值

val g = fn a:real => a + a

将被键入real -> real

于 2013-02-18T13:32:22.487 回答
0

你可以声明

open Real

在定义函数的范围内,但我强烈建议不要这样做。对函数进行类型注释是最好的方法。您不必注释每个参数,顺便说一句,做一个就足够了,或者在这种情况下,甚至是返回类型:

fun add(x : real, y) = x + y

fun add(x, y) : real = x + y
于 2013-02-18T16:21:38.720 回答