我在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
}
由于
答案 0 :(得分:8)
您的Final
类型应该有效,您只需手动创建TESTA
类型即可。所以你可以这样做:
let unittest =
{ Final.PartA = {foo = X; bar = Y};
Final.truth = true
}
答案 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)