haskell - 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>
推荐阅读
- r - RMarkdown - 使用 DT 创建列标题
- javascript - 将来自 html 网页的多个输入的数据保存为 .txt(本地)并将它们加载回相同的位置
- node.js - 特快专递数组未定义?
- azure-pipelines - 在 Azure Pipeline 中查找项目构建服务的名称
- visual-studio-code - 在 vscode 上使用内置设置同步时,实际文件在哪里?
- distance - 在 GeoPandas 中获取两点之间的距离
- c# - 如何使用 LocalDB 和 SQL 连接为我的 Visual Basic WinForms 应用程序创建安装程序/设置项目?
- python - 设置 Django 日期字段时出现错误
- c# - 参考似乎不起作用,没有抛出明显的错误
- visual-studio-extensions - Visual Studio Marketplace 上私有扩展的可见性