Function 这些功能有什么不同?

Function 这些功能有什么不同?,function,sml,smlnj,Function,Sml,Smlnj,我有一个函数: fn x => x 现在,参数x同时应用于实数和int(例如(x:real))。这两个功能的不同点和相同点是什么,尽管它们似乎有效地完成了相同的任务: 1. fn (x:int) => x; 2. fn (x:real) => x; 两个函数的输入和输出均为x。 但是,在第一个函数中,输入x被转换为int类型,而第二个函数被转换为real类型 因此,第一个函数类型为(int->int),第二个类型为(real->real),这三个函数都是身份函数,但第二个函

我有一个函数:

fn x => x
现在,参数x同时应用于实数和int(例如(x:real))。这两个功能的不同点和相同点是什么,尽管它们似乎有效地完成了相同的任务:

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

两个函数的输入和输出均为x。

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


因此,第一个函数类型为
(int->int)
,第二个类型为
(real->real)
,这三个函数都是身份函数,但第二个函数不是多态函数

非多态版本的作用并不完全相同——一个版本的类型为
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

在1。和2.,您不是在应用函数,而是在指定类型。要应用该函数,请编写
(fn x=>x)5
fn x=>x)5.0
。当您在应用程序中执行此函数时,确实会推断x具有您显式编写的类型

下面两个函数的区别在于它们采用不同的类型。这两个函数之间的相似之处在于,它们对输入执行相同的操作,即只返回输入。

(或类型转换)是一个错误的词,因为它意味着数据表示方式发生了变化。这里没有进行类型转换。