2014-04-22 33 views
1

我沒有在ML中做過任何編程,但我正在學習函數式編程。毫無疑問,ML的類型通常很特別,但我想知道是否可以進行類型轉換來解決嚴格的類型限制?如果你不能,那是因爲ML想要減少不正確類型的機會,還是它沒有被實現?你可以在ML中進行類型轉換嗎?

+1

有關ML的一切都是故意的。 :) –

回答

3

「類型鑄造」可能意味着很多不同的東西。至少有3種完全不同的用例:

  • 在特定不同類型(例如數字類型)之間轉換。 ML可以通過各自的功能實現,它們只是不會僞裝成「casts」

  • 從頂部類型(如Objectvoid*)往返鑄造。這只是一種破解壓制類型系統的方法。幸運的是,ML具有適當的參數多態性和代數數據類型,所以通常不需要這樣做。

  • 做了令人討厭的低級別詭計,徹底顛覆了類型系統。 ML通常不支持它,因爲它被設計成一種安全的高級語言。

什麼形式的鑄造你特別感興趣,爲什麼?

+0

感謝您的回答。我在談論第一個要點。我從來沒有真正想到第二個子彈類型鑄造。我很感興趣,因爲我看到你可以在ML中有[1,2,3]這樣的東西,但是你不可能有[1,[1,2],3](對不起,如果語法關閉),因爲所有第二個列表的元素不是相同的類型。所以,我想了一個像[1,2.0,3]這樣的例子。從技術上講,這是行不通的,但演員可以輕鬆解決這個問題。 – JustBlossom

+0

@ LearnLanguages96您的示例與ML無法區分;都失敗了,因爲列表中的第二個項目與第一個示例中的第一個項目具有不同的類型,它是一個「int list」,在第二個項目中它是「真實」的,但是重要的是它們不匹配。 SML太漂亮了,不能在標準中允許這樣的事情,但是有特定於實現的轉換,例如[在SML/NJ中的Unsafe結構中](http://www.smlnj.org/doc/SMLofNJ/pages/ unsafe.html)或[MLton中的MLtonStructure](http://mlton.org/MLtonStructure)。 –

+0

@ LearnLanguages96,你的例子是關於第二點。這就是通常使用代數數據類型的原因。我假設你的例子應該描述一棵樹,所以你可以定義'datatype'樹'L' B'列表'並寫入'B [L 1,B [L 1,L 2],L 3]'。或者如果你真的想要一個異構列表,那麼你也可以使用數據類型:'datatype item = N of int | S的字符串| b bool val xs = [N 5,B true,S「boo」,N 6]'。幸運的是,後一種情況在實踐中很少需要。 –

相關問題