OCaml 中的简单多态类型注释
Simple polymorphic type annotation in 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))
通用量化所有类型变量,就像在等效的 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>
在 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))
通用量化所有类型变量,就像在等效的 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>