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; e2
için sözdizimsel şeker gibi (fn _ => e2) e1
ve tanımlamak while e1 do e2
için sözdizimsel şeker gibi whiledo e1 (fn () => e2)
, nerede whiledo
bir 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 5
ilkini (an int option ref
), sonra SOME "Hello"
ikincisini (a string option ref
) koyar .
x
x
∀ α .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 x
oluşturduğumuzda int
, x [int]
bir referans hücre tutma NONE
ve sonra değerlendirmek için neden olur SOME 5
. Biz örneğini ikinci kez x
ile string
harfe olacak, x [string]
bir (hiç değerlendirmek farklı! ) Referans hücre tutma NONE
sonra 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ı?