2012-09-10 101 views
3

我將OCaml Format module轉換爲F#;請參閱我的earlier question將OCaml轉換爲F#:如何轉換OCaml格式模塊的類型

要開始我改變了

型尺寸

外部size_of_int:INT - >尺寸= 「%同一性」

外部int_of_size:尺寸 - > INT = 「%同一性」

讓size_of_int =的sizeof <int>

和我認識的幾個其他的調整是不正確的,但它讓我轉換成open_box和close_box相關的所有代碼,希望這三行。

現在我不得不更改這三行,以便測試我轉換的格式模塊的子集。

我知道具有size_of_int和int_of_size的行在外部可能會依賴於F#內核中的某個函數。我也知道%identity可能會被轉換忽略。

我最好的猜測是,我只需要創建一個簡單的類型命名大小與size_of_int和int_of_size,但如何?

編輯根據答覆Jeffrey Scofield

我能夠創建以下的F#代碼。

type size = 
    interface 
    abstract size_of_int : int -> size 
    abstract int_of_size : size -> int 
    end 

type size = int 
let size_of_int i = i 
let int_of_size s = s 

它允許我的Format模塊的子集成功編譯。

編輯

Jack,誰在下面回答,有在FSharpx.Compatibility.OCaml.Format.Format.fs 一個版本我還沒有」測試,但它是最compelete版本我目前所發現的。

回答

5

這些行:

type size 
external size_of_int : int -> size = "%identity" 
external int_of_size : size -> int = "%identity" 

創建抽象類型是相同爲int。轉換函數 是no-ops(身份函數)。我不知道F#的成語,但是在 OCaml中,您可以使用接口文件並避免使用「%身份」的巧妙。

(* Interface file *) 
type size 
val size_of_int : int -> size 
val int_of_size : size -> int 

(* Implementation file *) 
type size = int 

let size_of_int i = i 
let int_of_size s = s 

希望這可以更容易地轉換成F#。

2

作爲參考,還有另一種更類型安全的方式,您可以使用F#處理此代碼:使用度量單位類型註釋。

當您在F#中編寫type size = int時,size僅僅是int的別名 - 所以F#編譯器會高興地讓您混合並匹配它們。例如:

let someSize : size = 10 
let badSum = someSize + 3 // 'someSize' is used like another other 'int' 

如果你想多一點的類型安全,你可以定義單位的衡量的一種Size和使用它像這樣:

[<Measure>] type Size 
type size = int<Size> 

let inline size_of_int i = 
    LanguagePrimitives.Int32WithMeasure<Size> i 
let inline int_of_size s = int s 

// Now, using a variable of type 'size' where an 'int' is expected 
// (or vice versa) will result in a compilation error. 
let someSize = size_of_int 10 
let badSum = someSize + 3 // compilation error here 

如果你明天到來自OCaml的F#,這可能有些熟悉。 F#中的度量單位類型在編譯時被刪除,但它們有助於減少代碼中的簡單數學錯誤 - 幻像類型可用於OCaml中以實現相同的目的。

相關問題