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())