继续我关于类型级算术的一系列问题,我偶然发现了另一个问题:返回多态递归函数的类型。OCaml中的多态递归:返回值
这是代码:
module Nat : sig
type z = Z
type 'n s = S of 'n
type ('n) nat =
Zero : (z) nat
| Succ : ('n) nat -> ('n s) nat
val of_int : int -> 'n nat
end = struct
type z = Z
type 'n s = S of 'n
type ('n) nat =
Zero : (z) nat
| Succ : ('n) nat -> ('n s) nat
let rec of_int n : int -> 'n nat = function
0 -> Zero
| n -> Succ (of_int (n - 1))
end
编译收率:
Error: This expression [Succ (of_int (n - 1))] has type 'a s nat
but an expression was expected of type z nat
的问题是,该函数的返回值由零匹配子句第一图案设定为z NAT。相反,它应该是'a。 '一个nat?尝试制作添加两个不同Nat:的函数时也会发生此问题。
感谢您的帮助。
好的,我放弃了。 :(Haskell wiki使它看起来很简单,也许我应该在学习OCaml之前学习Haskell和/或ATS:P甚至可以在C++中使用它,真该死!谢谢你的时间,不管怎样, –
@OlleHärstedtATS会让* this *听起来很简单,因为它有一个集成的算术定理证明器,可以自动去掉可以自动处理的片段(如果你在这里试图在OCaml中进行内部代码静态证明,你肯定会这样做)会让你进入一个相关的世界的痛苦,与ATS的不同之处是从一开始就设计来处理那个(而不是OCaml),所以例如他们有一个“证明证人在运行时没有真正计算”的概念(证明视图),我认为最简单的(而不是简单*)做这些事情的方式是直接使用Coq或Agda,而不是Haskell。 – gasche