2015-10-20 131 views
2

我有一个功能:这些功能有什么不同?

fn x => x 

现在,参数x被应用到真实和INT(例如(X:真))。所不同的是,什么是对两个功能相同,即使他们似乎有效地做同样的事情:

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

回答

1

这三者都是身份函数,但后两者不是多态。

的非多态性的版本不这样做完全一样的 - 一个具有类型int -> int,其他real -> real,所以他们只能分别适用于intreal

例子:

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 
0

这两个函数需要x和输出x的输入。

然而,在第一功能的输入x为铸造为类型INT的,而第二浇铸是类型真实的。

因此,第一个功能是(int -> int)类型和第二个(real -> real)

+1

* [Casted](https://en.wikipedia.org/wiki/Type_conversion)*(或类型转换)是错误的词语,因为它意味着数据表示会改变。这里没有类型转换。 –

1

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

以下两个函数的区别在于它们采用不同的类型。这两种功能之间的相似之处在于它们对输入的做法是相同的,即它们只是将其退回。