2017-05-07 68 views
3

我正在嘗試執行http://okmij.org/ftp/tagless-final/nondet-effect.html#no-functor中的一個擴展練習並將int_t類型替換爲'a repr。儘管試圖做到這一點,我卡上看到以下錯誤:Ocaml值與模塊和簽名中的參數化類型不匹配

Values do not match: 
    val cons : '_a repr -> '_a list_t -> '_a list_t 
is not included in 
    val cons : 'a repr -> 'a list_t -> 'a list_t 

我實施cons看起來像

let cons: 'a repr -> 'a list_t -> 'a list_t = 
    liftm2 (fun h t -> h::t) 

這無疑具有正確的類型。爲什麼這些顯然是相同的類型不兼容?

回答

1

舉個簡單的例子幫助我解決了這個問題! 我能轉降低失敗的情況下,這樣的:

module type Test = sig 
    type 'a t 
    val id: 'a t -> 'a t 
end 

module TestT: Test = struct 
    type 'a t = 'a 

    let id_maker() x = x 
    let id: 'a t -> 'a t = 
    id_maker() 
end 

這表明我的犧牲品value restrictionthis other stack overflow question有類似的問題,但我被模塊錯誤消息誤導。 我通過從

let cons: 'a repr -> 'a list_t -> 'a list_t = 
    liftm2 (fun h t -> h::t) 

改變到

let cons: 'a repr -> 'a list_t -> 'a list_t = 
    fun h t -> liftm2 (fun h t -> h::t) h t 
固定的問題