F#地图和不同的对象

时间:2015-01-27 22:50:21

标签: dictionary f#

我有一些非描述但不同的对象(特别是逻辑表达式中的未命名变量),我想将它们放在一个地图中,将它们与它们的值相关联。据我了解,地图需要通过某些有序字段来区分对象,所以我不能只有

type Term =
...
| Var

因为这不允许不同的变量彼此区分。相反,我可能有

type Term =
...
| Var of int64

然后有一个new_var函数,它递增一个全局int64计数器并返回一个带有递增值的新变量。这似乎有点不优雅,但应该有效。

全局计数器是否是推荐的处理方法,还是有更惯用的方法?

1 个答案:

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