2010-11-06 21 views
8

F #, örtük dönüşümleri desteklemiyor. Bunun bir özellik olduğunu anlıyorum, ancak hiçbir bilginin kaybolmaması durumunda bile örtülü dönüşümlerin neden yasak olduğunu anlamıyorum. Örneğin:Niçin F # içinde örtük dönüşümler yok?

sqrt 4  // Won't compile. 

ben sorun örtülü sqrt gereği budur bir float e int 4 dönüştürmek görmüyorum.

Bu konuda ışık tutabilir mi?

cevap

13

Tip denetleyicisi neredeyse klasik güçlü tipte yeniden yapılandırmaya bağlıdır. Örneğin, örtülü yayınlar veya zayıf tipte bir sistem aracılığıyla kullanılabilen zorlama türünü gerektirir, ancak bu tür bir tür çıkarsamaya izin verilmez. F # OCaml geldiğinden

son derece bilgiçlik kalarak programın doğruluğunu garanti etmeye çalışır bir tür imar etti: algoritma iyi yazmaya programınızın bütün türlerini birleştirmeye çalışır ve bu takdirde yapılamaz Zayıf tip bir kural, bir float gibi bir tamsayı dikkate almayı sağlar.

+0

siz "... bir şamandıra gibi bir tamsayı dikkat etmek", kastettiniz? – royco

+0

evet tamir ettirebilir noktası (rakamıyla türünü genişletme veya kısıtlayan) karşısında durumda – Jack

+0

daha zayıf bir tip kuralı olan, derleyici zorunda olduğu çok daha büyük bir arama alanı yol açacağını söylemek daha iyi olurdu için ters olabilir ayrıca eğer türlerin hepsinin “mantıksal olarak doğru” olduğunu ispatlamak için süreç. –

5

Yukarıdaki yanıtlara ek olarak, tamsayı ile float arasındaki dönüşümler, hesaplama açısından not actually free; Derleyici değil, sizin hedefiniz yüksek performanslı kod yazmak ise sizden "gizleme" ile size bir iyilik yapıyor. Bu, OCaml ve F # hakkında sevdiğim şeylerden biri: hatta onlar çok yüksek seviyeler, hala ne yaptığınızı tam olarak bilmeniz gerekir.