添加到fsharp中的类型

时间:2016-08-15 16:40:19

标签: f#

我在fsharp的任务中遇到了一些困难。

目前我有一个预先声明的有用类型,例如

type TESTA =
{ foo : Float
  bar: factorA.double
}

由于类型的性质(在其他地方使用),我无法直接更改它(或以相同的方式重新声明它)。但是我需要在集合中添加另一个定义,只需要一个简单的bool,所以类型可以看起来像这样(如果我可以直接更改它)

type TESTA =
{ foo : Float
  bar: factorA.double
  truth: bool
}

如何在不直接更改类型的情况下获得相同的效果?我试过了:

type Final=
{ PartA: TESTA
  truth: bool
}

但是要创建这种类型的子类型'不允许我单独访问foo / bar(据我可以测试):

let unittest =
  {  Final.TESTA.foo = X <- this doesnt work :(
    Final.truth = true <- this does work
  }

由于

2 个答案:

答案 0 :(得分:8)

您的Final类型应该有效,您只需手动创建TESTA类型即可。所以你可以这样做:

let unittest =
  {  Final.PartA = {foo = X; bar = Y};
     Final.truth = true
  }

如果你有很多这样的嵌套记录类型,你可能需要考虑尝试Aether及其Lenses功能。

答案 1 :(得分:4)

您提供的示例中没有一个是工作代码,但除此之外:要扩展Ringil添加的内容,这是使用记录的正确方法:

type TESTA =
    { foo : float
      bar : int
      }

type Final = 
    { PartA : TESTA
      Truth : bool 
      }

let TestaTest = 
    { TESTA.foo = 1.0
      TESTA.bar = 0
      }

let FinalTest = 
    { Final.PartA = TestaTest
      Final.Truth = true
      }

let FinalTest2 = { FinalTest with PartA = { FinalTest.PartA with foo = 2.0 } }

let TestaMember = FinalTest2.PartA 

这是所有正常工作的代码。

如果你只是在特定的地方使用这种新类型,那么使用元组会更有意义吗?

let ConvenientTuple = (TestaTest, true)

// Then to use it with pattern matching, for example:
match ConvenientTuple with 
| _, false -> DoSomething()
| n, true when n.foo > 1.0 -> DoAnotherThing(n)
| m, true -> DoDefaultThing(n)

结帐F# for fun and profit page on records