【问题标题】:subtract functions with type real in ml在 ml 中减去 real 类型的函数
【发布时间】:2013-08-22 22:54:11
【问题描述】:

我正在尝试在 moscow ml 中减去两个函数(都是 real 类型)。然后它说“重载 - 不能应用于 real -> real 类型的参数。那么我应该如何编写函数?

fun CircleArea  x = x*x*Math.pi

fun SquareArea x:real = 4*x*x

fun Area x = SquareArea - CircleArea

【问题讨论】:

    标签: sml ml


    【解决方案1】:

    您可能实际上并不想从另一个函数中减去一个函数,而是这些函数在应用后的返回值。您可以通过以下方式实现:

    fun Area x = (SquareArea x) - (CircleArea x)
    

    括号不是强制性的,因为函数应用程序(即SquareAreax 之间的空格)比任何二元运算符(包括-)绑定得更紧密。

    您应该考虑在 ML 中使用以下命名约定:常规函数具有小写的起始符号,而代数类型的值构造函数具有大写的起始符号。例如:

    fun area x = squareArea x - circleArea x
    

    但是:

    datatype shape = Square of int * int
                   | Circle of int
    

    【讨论】:

      【解决方案2】:

      我们在数学中的函数减法不是作为内置运算符提供的。但是,您可以定义自己的。

      从数学上讲,我们定义

      (f - g)(x) = f(x) - g(x)
      

      我们可以在 SML 中复制这个定义如下:

      infix 5 --
      fun f -- g = fn x => f x - g x
      

      它的作用是产生一个运算符--,这样f -- g 就会产生对应于fn x => f x - g x 的函数,即给定x 的函数计算f x - g x

      注意,由于 - 运算符中的类型模糊性,默认情况下允许您减去 'a -> int 函数。在您的情况下,您需要减去 'a -> real 函数,因此您需要稍作修改:

      infix 5 --
      fun f -- g = fn x => f x - g x : real
      

      如果你使用这个---operator,你将能够像这样定义你的Area函数:

      val area = squareArea -- circleArea;
      

      (我冒昧地将函数名称的第一个字母小写,以匹配 SML 命名约定。)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-08
        • 2016-04-27
        • 1970-01-01
        • 2018-07-02
        • 1970-01-01
        • 2019-01-13
        • 1970-01-01
        • 2019-06-19
        相关资源
        最近更新 更多