【问题标题】:What is so different about these functions?这些功能有什么不同?
【发布时间】:2016-01-19 16:02:04
【问题描述】:

我有一个函数:

fn x => x

现在,参数 x 应用于 real 和 int(例如 (x:real))。这两个函数有什么不同和什么相同,尽管它们似乎有效地做同样的事情:

1. fn (x:int) => x;
2. fn (x:real) => x;

【问题讨论】:

    标签: function sml smlnj


    【解决方案1】:

    这两个函数都接受 x 的输入和 x 的输出。

    但是,在第一个函数中,输入 x 被转换为为 int 类型,而第二个被转换为 real 类型>.

    因此第一个函数的类型是(int -> int),第二个函数是(real -> real)。

    【讨论】:

    • Casted(或类型转换)是错误的词,因为它暗示数据表示会发生变化。这里没有进行类型转换。
    【解决方案2】:

    这三个都是恒等函数,但后两个不是多态的。

    非多态版本的作用并不完全相同——一个是int -> int,另一个是real -> real,所以它们只能分别应用于int和real。

    例子:

    Standard ML of New Jersey v110.79 [built: Wed Oct  7 00:59:52 2015]
    fn (x:int) => x;
    val it = fn : int -> int
    - fn (x:real) => x;
    val it = fn : real -> real 
    - (fn (x:int) => x) 3;
    val it = 3 : int
    - (fn (x:int) => x) 3.0;
    stdIn:2.1-2.22 Error: operator and operand don't agree [tycon mismatch]
      operator domain: int
      operand:         real
      in expression:
        (fn x : int => x) 3.0
    - (fn (x:real) => x) 3;
    stdIn:1.2-1.22 Error: operator and operand don't agree [overload conflict]
      operator domain: real
      operand:         [int ty]
      in expression:
        (fn x : real => x) 3
    - (fn (x:real) => x) 3.0;
    val it = 3.0 : real
    

    相比之下,多态版本适用于一切:

    - fn x => x;
    val it = fn : 'a -> 'a
    - (fn x => x) 3.0;
    val it = 3.0 : real
    - (fn x => x) 3;
    val it = 3 : int
    - (fn x => x) "hello";
    val it = "hello" : string
    - (fn x => x) [1,2,3];
    val it = [1,2,3] : int list
    

    【讨论】:

      【解决方案3】:

      在 1. 和 2. 中,您不是在应用函数,而是在指定类型。为了应用这个功能,写(fn x => x) 5和fn x => x) 5.0。当你执行这个函数应用程序时,x 确实被推断为具有你显式编写的类型。

      您下面的两个函数之间的区别在于它们采用不同的类型。这两个函数的相似之处在于它们对输入的处理方式相同,即只是将其返回。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-07
        • 1970-01-01
        • 2019-08-18
        • 1970-01-01
        • 1970-01-01
        • 2022-08-09
        • 1970-01-01
        • 2014-02-12
        相关资源
        最近更新 更多