我有一些非描述但不同的对象(特别是逻辑表达式中的未命名变量),我想将它们放在一个地图中,将它们与它们的值相关联。据我了解,地图需要通过某些有序字段来区分对象,所以我不能只有
type Term =
...
| Var
因为这不允许不同的变量彼此区分。相反,我可能有
type Term =
...
| Var of int64
然后有一个new_var
函数,它递增一个全局int64计数器并返回一个带有递增值的新变量。这似乎有点不优雅,但应该有效。
全局计数器是否是推荐的处理方法,还是有更惯用的方法?
答案 0 :(得分:2)
当你声明一个这样的类型时,它不是真正的“必须区分对象的地图”:
type Term =
| Var
您的类型具有单个有效值 - Var
。如果你说你想拥有不同的对象 - 这不是你想要的。您仍然可以将该类型用作地图中的关键字 - 虽然它不是特别有用,因为它最多只包含一个元素。
使用计数器是一种很好的方法来处理它。如果你不想要一个“全局”的,你可以使用ref单元格将它滚动到一个函数中来保存它:
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())