2011-12-06 12 views
7

Może ktoś wyjaśnić krok po kroku typu wnioskowania w następujących F # programu:Hindley Milner Rodzaj Wnioskowanie w F #

let rec sumList lst = 
    match lst with 
    | [] -> 0 
    | hd :: tl -> hd + sumList tl 

I specjalnie chcą zobaczyć krok po kroku, w jaki sposób proces unifikacji w Hindley Milner działa.

+0

Myślę, że to może należeć do innej witryny SE, ale nie wiem, które :) –

+0

Jeśli to możliwe, możesz mi podać link do tego? To było by pomocne. – riship89

+0

Cóż, myślę, że to należy do Theo CS, ale nie sądzę, że by to przyjęli.Dopóki nie pojawi się inteligentny moderator, myślę, że to pozostanie tutaj :) –

Odpowiedz

14

Zabawne rzeczy!

Najpierw musimy wynaleźć typu rodzajowego do sumList: x -> y

i uzyskać prostych równań: t(lst) = x; t(match ...) = y

Teraz dodać równanie: t(lst) = [a] powodu (match lst with [] ...)

Wtedy równanie: b = t(0) = Int; y = b

Od 0 jest możliwy wynik meczu: c = t(match lst with ...) = b

Od drugiego wzoru: t(lst) = [d]; t(hd) = e; t(tl) = f; f = [e]; t(lst) = t(tl); t(lst) = [t(hd)]

Guess typu (typ ogólna) dla hd: g = t(hd); e = g

Następnie musimy typ dla sumList, więc musimy po prostu dostać bezsensowny typ funkcyjny teraz: h -> i = t(sumList)

Więc teraz wiemy: h = f; t(sumList tl) = i

Następnie z dodawania otrzymujemy: Addable g; Addable i; g = i; t(hd + sumList tl) = g

Teraz możemy przystąpić unifikacja:

t(lst) = t(tl)=>[a] = f = [e]=>a = e

t(lst) = x = [a] = f = [e]; h = t(tl) = x

t(hd) = g = i/\i = y=>y = t(hd)

x = t(lst) = [t(hd)]/\t(hd) = y=>x = [y]

y = b = Int/\x = [y]=>x = [Int]=>t(sumList) = [Int] -> Int

Pominąłem kilka trywialnych kroków, ale myślę, że możesz się dowiedzieć, jak to działa.

+0

Dzięki :) musiałem przeczytać każdą linijkę dwa razy - trzy razy, ale teraz to rozumiałem. Dzięki jeszcze raz. – riship89