6

一般的な等価/比較メンバーの設計ガイドラインは、可変参照型に構造的等価性を実装しないことですが、可変フィールドを持つ F# レコード型を見てください。

type Value = { mutable value: int }

let mutableRecord = { value = 1 }
let xs = Map.ofList [ mutableRecord, "abc"
                      { value = 2 }, "def" ]

let abc = Map.find { value=1 } xs
mutableRecord.value <- 3
let abc = Map.find { value=3 } xs // KeyNotFoundException!

Map内部でソートされmutableますが、レコード インスタンスが既にマップ内にある場合でも、レコード フィールドを使用すると順序を変更できます。これは非常に悪いことです。

F# は、変更可能なフィールドを宣言する F# レコード型に対してモードを推論する必要がある[<NoEquality>]と思いますね。[<NoComparison>]

4

1 に答える 1

5

それは不合理なスタンスではありません。

この機能を有効に活用するための巧妙な方法がいくつかあるかもしれませんが、私は十分に深く考えていません。これは基本的に、変更可能な型を に配置した場合と同じでありDictionary、それに値するものを取得します。(言語はすべての誤用を防ぐことはできません。そのため、ギャップを埋めるための設計ガイドラインとプログラマーの判断があります:))

ともあれ、今さら変えるわけにはいかない。

于 2011-01-18T17:08:44.177 に答える