2017-05-07 14 views
3

http://okmij.org/ftp/tagless-final/nondet-effect.html#no-functorに拡張演習を行い、にint_t型を置き換えようとしています。これをやろうとしている間、私は次のようなエラーにこだわっている:consOcamlの値がモジュールとシグネチャのパラメータ化された型と一致しません

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 

私の実装は間違いなく正しい型を持っている

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 restrictionに犠牲になっていたことを示しています。 this other stack overflow questionにも同様の問題がありますが、モジュールのエラーメッセージに惑わされました。 私は

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

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

から変更することで問題を修正しました

関連する問題