【发布时间】:2015-08-11 13:52:03
【问题描述】:
假设我想要一个记录类型,例如:
type CounterValues = { Values: (int) list; IsCorrupt: bool }
问题是,我想创建一个构造函数,将传递的整数列表转换为没有负值的新列表(它们将被 0 替换),并且只有在找到负值时才具有 IsCorrupt=true在施工时。
这可以用 F# 实现吗?
目前,这就是我所做的,使用属性(但是,嗯,它不是很 F#-ish,它每次都会在 getter 处调用 ConvertAllNegativeValuesToZeroes(),因此效率不高):
type CounterValues
(values: (int) list) =
static member private AnyNegativeValues
(values: (int) list)
: bool =
match values with
| v::t -> (v < 0) || CounterValues.AnyNegativeValues(t)
| [] -> false
static member private ConvertAllNegativeValuesToZeroes
(values: (int) list)
: (int) list =
match values with
| [] -> []
| v::t ->
if (v < 0) then
0::CounterValues.ConvertAllNegativeValuesToZeroes(t)
else
v::CounterValues.ConvertAllNegativeValuesToZeroes(t)
member this.IsCorrupt = CounterValues.AnyNegativeValues(values)
member this.Values
with get()
: (int) list =
CounterValues.ConvertAllNegativeValuesToZeroes(values)
【问题讨论】:
-
除非您需要它用于某种互操作,否则您可能希望避免使用这样的布尔标志:google.com/search?hl=en&q=boolean+blindness
标签: types constructor f# record