【问题标题】:use non-default overloaded operator in smlnj在 smlnj 中使用非默认重载运算符
【发布时间】: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 的事情,但我真的无法在任何地方找到它..

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    您可以通过多种方式让 SML 键入 op+ 作为真正的对应项。

    取决于你有什么代码,

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

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

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

    【讨论】:

      【解决方案2】:

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

      例如,虽然

      val f = fn a => a + a
      

      将输入int -> int,这个值

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

      将输入real -> real

      【讨论】:

        【解决方案3】:

        你可以声明

        open Real
        

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-11
          • 2011-05-02
          • 2015-03-13
          • 2020-03-05
          相关资源
          最近更新 更多