首页 > 解决方案 > OCaml 中的简单多态类型注释

问题描述

在 ocaml 中进行这种类型检查是否需要一些注释?

type ('a,'b) roll = Roll of (('b,'a) roll -> 'b)
let unroll (Roll f) = f 

(* nope-   
This definition has type        ('b, 'b) roll -> ('b, 'b) roll -> ('b, 'b) roll
which is less general than  'c. ('b, 'c) roll -> ('b, 'b) roll -> ('b, 'c) roll *)

let rec (-:) : 'c. ('b,'c) roll -> ('a,'b) roll -> ('a, 'c) roll = fun f g ->
  Roll (fun k  ->  unroll f (g -: k)) 


(* nope -- unifies to 1 type ! 
let rec (-:) = fun f g ->
  Roll (fun k  ->  unroll f (g -: k)) 
*)

Haskell 中的相同代码需要类型注释

{-# LANGUAGE RankNTypes #-}

newtype Roll a b = Roll (Roll b a  -> b)
unroll (Roll f) = f

(-:) :: forall a b c. Roll b c -> Roll a b -> Roll a c 
(-:)  f g =  Roll (\k  ->  unroll f (g -: k)) 

标签: haskellpolymorphismocaml

解决方案


普遍量化所有类型变量,就像在等效的 Haskell 代码中一样,似乎工作正常:

let rec (-:) : 'a 'b 'c. ('b, 'c) roll -> ('a, 'b) roll -> ('a, 'c) roll = fun f g ->
  Roll (fun k  ->  unroll f (g -: k))
val ( -: ) : ('b, 'c) roll -> ('a, 'b) roll -> ('a, 'c) roll = <fun>

推荐阅读