3

OCaml Format モジュールを F# に変換しています。私の以前の質問を参照してください。

始めるために私は変わりました

タイプサイズ

外部 size_of_int : int -> size = "%identity"

外部 int_of_size : サイズ -> int = "%identity"

let size_of_int = sizeof <int>

私が知っている他のいくつかの調整は正しくありませんが、open_box と close_box に関連するすべてのコードをこれらの 3 行を期待して変換することができました。

ここで、変換したフォーマット モジュールのサブセットをテストできるように、これらの 3 行を変更する必要があります。

size_of_int と int_of_size を含む行と外部の行は、おそらく F# コアの関数に依存することを知っています。また、変換では%identityをおそらく無視できることも知っています。

私の最善の推測では、size_of_int と int_of_size を使用して 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 にバージョンを持っています。私はまだテストしていませんが、現在見つけた中で最も完全なバージョンです。

4

2 に答える 2

5

これらの行:

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

int と同一の抽象型を作成します。変換関数は no-ops (恒等関数) です。F# のイディオムはわかりませんが、OCaml ではインターフェイス ファイルを使用して、"%identity" で賢さを回避できます。

(* 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# に変換されることを願っています。

于 2012-09-10T21:53:05.997 に答える
2

参考までに、F# でこのコードを処理できる、よりタイプ セーフな方法がもう 1 つあります。それは、測定単位の型注釈を使用することです。

type size = intF# で記述する場合、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 ではファントム型を同じ目的で使用できます。

于 2012-09-11T18:45:07.500 に答える