2013-05-02 61 views
0

我想在OCaml中編寫一個OCaml評估器。基本上我需要模仿OCaml的typechecker。我有下面的代碼,它應該返回一個類型,但編譯器抱怨類型不匹配。我不同意這種類型的推論

let rec typecheck (expr:moexpr) (tenv:type environment) = 
    match expr with 
    | ... 
    | Match(e, (pat, exp)::l) -> let etype=(typecheck e tenv) in 
    (List.fold_left (fun (cp, ce) fp -> (typecheck ce (matchtype tenv cp etype))) 
    (typecheck exp tenv) (pat, exp)::l) 

以我倍左我請鹼,爲(typecheck exp tenv)這應該是一個motype(我喜歡的類型的類型)。錯誤是摺疊左功能(typecheck ce (matchtype tenv cp etype))評估爲一個motype,這並不奇怪,但預期的類型是mopat * moexpr - mopat是我的模式類型。不應該摺疊左操作的值是基類型還是函數返回類型?

+0

「我不同意類型檢查器說什麼」=>「我錯了我的程序」。 – gasche 2013-05-02 04:49:11

回答

3

既然你正在寫一個類型檢查器,我想我不需要解釋類型推斷是如何工作的。

檢查fold_left的類型。它需要一個函數,其第一個元素是累加器,而你的「基數」是初始累加器。你的累加器有形式(cp,ce),所以它的類型是mopat * moexpr,但是你的基礎acc有motype。我猜這些觀點是錯誤的。翻轉(cp,ce)和fp然後它看起來更好。你仍然有一個fp的問題,即真正的累加器,它從來沒有使用過。