我想在一個自定義類型做一些數學運算與decimal options
:算術十進制選項類型
type LineItem = {Cost: decimal option; Price: decimal option; Qty: decimal option}
let discount = 0.25M
let createItem (c, p, q) =
{Cost = c; Price = p; Qty = q}
let items =
[
(Some 1M , None , Some 1M)
(Some 3M , Some 2.0M , None)
(Some 5M , Some 3.0M , Some 5M)
(None , Some 1.0M , Some 2M)
(Some 11M , Some 2.0M , None)
]
|> List.map createItem
我可以做一些非常簡單的算術與
items
|> Seq.map (fun line -> line.Price
|> Option.map (fun x -> discount * x))
這給了我
val it : seq<decimal option> =
seq [null; Some 0.500M; Some 0.750M; Some 0.250M; ...]
如果我試着實際計算出我需要的東西
items
|> Seq.map (fun line -> line.Price
|> Option.map (fun x -> discount * x)
|> Option.map (fun x -> x - (line.Cost
|> Option.map (fun x -> x)))
|> Option.map (fun x -> x * (line.Qty
|> Option.map (fun x -> x))))
我得到的,我本來期望一個seq<decimal option>
錯誤
error FS0001: Type constraint mismatch. The type
'a option
is not compatible with type
decimal
The type ''a option' is not compatible with the type 'decimal'
。
我必須錯過一些東西,但我似乎無法發現我失蹤的任何東西。
與同事交談後,我看到這個答案之前寫了一個'optionMap2'函數。 – Steven
@Steven當你有3個選項時會發生什麼?你會寫「map3」嗎?好吧,這只是一個細節,但可讀性呢?我不認爲用前進管道一步一步做數學公式會很好。當你所有的數學公式都在一個地方時,請看看我和其他人提供的替代方案。我會推薦你選擇的解決方案,將所有公式放在一個地方,而不是分成不同的行。 – Gustavo