F# 映射和不同的对象
F# map and distinct objects
我有一些不起眼但不同的对象(特别是逻辑表达式中未命名的变量),我想将它们放入映射中,将它们与其值相关联。据我了解,地图需要通过一些有序的字段来区分对象,所以我不能只有
type Term =
...
| Var
因为这不允许不同的变量相互区分。相反,我大概可以
type Term =
...
| Var of int64
然后有一个 new_var
函数来递增一个全局 int64 计数器和 returns 一个具有递增值的新变量。这看起来有点不雅,但应该可以。
全局计数器是处理此问题的推荐方法,还是有更惯用的方法?
这不是真正的 "map having to distinguish objects" 事情 - 当您声明这样的类型时:
type Term =
| Var
您的类型只有一个有效值 - Var
。如果你说你想要不同的对象 - 这不是你想要的。您仍然可以将该类型用作地图中的键 - 虽然不是特别有用的类型,因为它最多只有一个元素。
使用计数器是处理它的好方法。如果你不想要 "global" 一个,你可以将它滚动到一个函数中,使用一个引用单元格来保存它:
type Term =
| Var of int
let make =
let counter = ref 0
fun () ->
counter := !counter + 1
Term.Var (!counter)
或者如果您不关心这些值并且不希望计数器出现在画面中,则使用 GUID:
type Term =
| Var of System.Guid
let make () =
Term.Var (System.Guid.NewGuid())
我有一些不起眼但不同的对象(特别是逻辑表达式中未命名的变量),我想将它们放入映射中,将它们与其值相关联。据我了解,地图需要通过一些有序的字段来区分对象,所以我不能只有
type Term =
...
| Var
因为这不允许不同的变量相互区分。相反,我大概可以
type Term =
...
| Var of int64
然后有一个 new_var
函数来递增一个全局 int64 计数器和 returns 一个具有递增值的新变量。这看起来有点不雅,但应该可以。
全局计数器是处理此问题的推荐方法,还是有更惯用的方法?
这不是真正的 "map having to distinguish objects" 事情 - 当您声明这样的类型时:
type Term =
| Var
您的类型只有一个有效值 - Var
。如果你说你想要不同的对象 - 这不是你想要的。您仍然可以将该类型用作地图中的键 - 虽然不是特别有用的类型,因为它最多只有一个元素。
使用计数器是处理它的好方法。如果你不想要 "global" 一个,你可以将它滚动到一个函数中,使用一个引用单元格来保存它:
type Term =
| Var of int
let make =
let counter = ref 0
fun () ->
counter := !counter + 1
Term.Var (!counter)
或者如果您不关心这些值并且不希望计数器出现在画面中,则使用 GUID:
type Term =
| Var of System.Guid
let make () =
Term.Var (System.Guid.NewGuid())