Tür çıkarımına düzgün ve işlevsel bir referans arıyorsanız, Gundry, McBride ve McKinna'nın 2010 " Bağlamda Tür Çıkarımı" için kısmen kısayım , ancak bu mevcut mevcut uygulamalar için iyi bir rehber olmayabilir .
Eğer tanımlarsanız: Ben cevabın parçası olduğunu, değer kısıtlaması ötesinde, gerçekten çok zorluk zorunlu dillere Hindley'nin-Milner tipi çıkarımı adapte olduğunu yoktur düşünüyorum e1; e2için sözdizimsel şeker gibi (fn _ => e2) e1ve tanımlamak while e1 do e2için sözdizimsel şeker gibi whiledo e1 (fn () => e2), nerede whiledobir düzenli özyinelemeli işlev
fun whiledo g f = if g then (f (); whiledo g f) else ();
o zaman tür çıkarımı da dahil olmak üzere her şey iyi çalışır .
Değer kısıtlamasının özel bir teknik olmasına gelince, aşağıdaki hikayeyi seviyorum; Karl Crary'den aldığımdan eminim. Değer kısıtlamasının ML'de yazmanızı engelleyeceği şu kodu göz önünde bulundurun:
let
val x: 'a option ref = ref NONE
in
(x := SOME 5; x := SOME "Hello")
end
Tamamen problemsiz olan aşağıdaki kodla karşılaştırın:
let
val x: unit -> 'a option ref = fn () => ref NONE
in
(x () := SOME 5; x () := SOME "Hello")
end
İkinci örneğin ne yaptığını biliyoruz: içeren iki yeni ref hücresi oluşturur NONE, sonra SOME 5ilkini (an int option ref), sonra SOME "Hello"ikincisini (a string option ref) koyar .
xx∀ α .ref ( seçenek (α))xΛ α . ref [ α ] ( YOK )
Bu, ilk örneğin bir "iyi" davranışının, ikinci örneğin davrandığı gibi davrandığı anlamına gelir - tür düzeyinde lambda'yı iki farklı kez başlatın. İlk kez örnek xoluşturduğumuzda int, x [int]bir referans hücre tutma NONEve sonra değerlendirmek için neden olur SOME 5. Biz örneğini ikinci kez xile stringharfe olacak, x [string]bir (hiç değerlendirmek farklı! ) Referans hücre tutma NONEsonra ve SOME "Hello". Bu davranış "doğru" (tip-güvenli), ama kesinlikle bir programcının beklediği şey bu değildir ve bu yüzden bu beklenmedik davranış türüyle ilgilenen programcılardan kaçınmak için ML'deki değer kısıtlamasına sahibiz.
let val x = ref 9 in while !x>0 do (print (Int.toString (!x)); x := !x-1) end. Peki bir araştırma sorusu düzeyinde, aradığınız cevap "değer kısıtlaması dahil Caml / SML'de geliştirilen teknikleri uygulayın" mı?