2010-09-15 29 views

cevap

20

ML diller statik olarak yazıldığında, bu nedenle bir şey farklı zamanlarda farklı türleri vardır mümkün değil:

böyle kullanmak istiyorum. x bazen int türüne sahip olamaz ve diğer zamanlarda string türüne sahiptir. Böyle bir davranış gerekiyorsa, bu konuda çıkmanın normal yolu gibi bilgileri yazın kodlar bir kap içinde değerini sarılmasıdır: Sonra

datatype wrapper = Int of int | Real of real | String of string 

yapabilirsiniz yapıcı üzerindeki desen maç:

case x of Int x -> foo 
     | Real x -> bar 
     | String x -> ... 

Bu durumda, x açıkça wrapper olarak yazılmıştır, bu da işe yarayacaktır.

8

x polimorfik tipte olsa bile (genel olarak Chuck'ın önerdiği gibi), genel olarak istediğinizi yapmak mümkün değildir.

Bu, kasıtlı bir tasarım kararıdır; İşlevleri hakkında, sadece türlerine bağlı olarak, aksi halde yapamayacağınız çok güçlü sonuçlar çıkarmayı mümkün kılar. Örneğin, 'a -> 'a türünde bir işlevin kimlik işlevi (veya her zaman bir istisna atar veya bir işlev döndürmeyen bir işlev) olması gerektiğini söylemenizi sağlar. Eğer 'a zamanında ne incelemek olsaydı, kuralı ihlal eder

fun sneaky (x : 'a) : 'a = if x = int then infinite_loop() else x 

gibi sinsi bir program yazabilir. (Bu oldukça önemsiz bir örnektir, ancak sisteminizde bu özelliği bulunduğunu bilerek yapabileceğiniz çok daha az önemsiz şeyler vardır.)

İlgili konular