2013-04-26 25 views
1

我明天在SML/NJ參加考試,我在一些不同的過去的決賽中看到過這個問題,但是我不知道該如何思考。分類正確或錯誤(SML/NJ)

假設在(虛構)語言PML中,我們將int作爲float的子類型。對或錯?

  1. int類型的函數 - >浮 - > INT總是可以代替類型 INT的函數來提供。 (true?)
  2. 總是可以提供類型爲int - > bool的函數來代替類型爲 的函數float - > bool。 (true?)
  3. 總是可以提供類型爲int - >(int ref)的函數來代替 int - >(float ref)的函數。 (false?)
  4. 可以始終提供類型爲(int x float) - > int的函數來代替type(float x int) - > float的函數。 (?假)

回答

2

下面是子類型的定義:http://en.wikipedia.org/wiki/Subtyping

如果float是超,並int是子類型,那麼你可以傳遞一個int成期望一個float任何功能。在面向對象的範例中,你會說intfloat延伸或下降,這意味着int可以在任何地方使用float可以,但不是反之亦然。

我如何看待程序員的期望。如果你有一個函數曾經接受一個int,你期望能夠仍然給它一個int。所以你不能取代任何不是int的子類型的東西。對於輸出,如果你期望得到一個int,交換函數不能返回除int或子類型之外的任何東西。否則,當你將返回的值傳遞給下一個函數時,它可能會中斷。

現在真/假:

  1. 真正因爲如果你想像換一個int -> float功能與int -> int一個在高階函數或返回值傳遞給另一個函數:

    round (int_to_float x) (* or *) round (int_to_int x) 
    

    round將能夠處理float和int兩者。

  2. false,因爲新函數可能會利用傳入的浮點數無法容納的特定屬性int。例如:

    fun negative x = x < 0 
    (* subbed for *) 
    fun even x = x mod 2 == 0 
    

    明確把甚至負會導致錯誤

  3. ,因爲你必須要考慮從參考兩讀,寫的參考。當從參考讀數:

    !x:float (* int ref or float ref work *) 
    x := n:int (* only int ref works *) 
    

    並在那裏的漁獲。在閱讀時,有一種寬容的方式,在寫作時,寬容是另一種方式。唯一的重疊是一種類型,所以你不能代替裁判。

+0

由於這是一個更加清晰吧! – user2066749 2013-04-26 11:33:24