2015-10-20 186 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確實被推斷爲具有您明確寫入的類型。

以下兩個函數的區別在於它們採用不同的類型。這兩種功能之間的相似之處在於它們對輸入的做法是相同的,即它們只是將其退回。