繼續我關於類型級算術的一系列問題,我偶然發現了另一個問題:返回多態遞歸函數的類型。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