代码之家  ›  专栏  ›  技术社区  ›  ljs TheVillageIdiot

调整已识别联合对象的值

f#
  •  1
  • ljs TheVillageIdiot  · 技术社区  · 16 年前

    因此,还有一个歧视工会的问题:——)

    假设我有这样一个受歧视的工会:-

    type Foo =
      | A of string
      | B of int
      | C of char
      | D of string
    

    我希望能够使用函数appendStringToFoo,如下所示:-

    let someVal = A("hi")
    let anotherVal = D("yo")
    
    let hiya = someVal |> appendStringToFoo "ya"
    let yoyo = anotherVal |> appendStringToFoo "yo"
    

    其中hiya=A(“hiya”)

    显然,我还将继续编写单独的函数appendIntToFoo、appendCharToFoo等。

    let appendStringToFoo str fooValue =
      fooValue(fooValue.Value + str)
    

    这似乎是不可能的。

    let appendStringToFoo str fooValue =
        match fooValue with
        | A(originalStr) -> A(originalStr + str)
        | D(originalStr) -> D(originalStr + str)
    

    因为这意味着每次添加新的工会案例时,我都必须重新编写此代码。

    有什么想法吗?

    1 回复  |  直到 16 年前
        1
  •  2
  •   Brian    16 年前

    你必须做你不想做的事。

    另一种选择是

    • 抽象类Foo
    • A类:StringyFoo
    • D类:StringyFoo
    • B类:IntyFoo

    通常,在词法分析/解析中,无论您使用类层次结构和访问者模式,还是使用代数数据类型,都必须为N个特征和M个子类型编写N*M代码;这是无法避免的,所以不要费心去寻找可爱的小把戏来避免它,它只会导致痛苦。