它看起來像Railway oriented programming將是一個很好的適合在這裏。 如果你選擇走這條路線,你基本上有兩個選擇。 您可以全部進入或快速路線。
快速航線
你重寫你的驗證功能,採取Person option
,而不是隻是普通Person
。
let validAge (record:Record option) =
match record with
| Some rec when rec.Age < 65 && rec.Age > 18 -> record
| None -> None
現在你應該可以很容易地鏈接你的功能。
checks |> List.reduce (>>)
所有
另外,如果你是懶惰,不想匹配..在每個驗證功能,你可以寫更多的代碼。 (取自[1]的樣本)
首先有一些設置要做。 我們將定義一個特殊的返回類型,這樣我們可以得到有意義的錯誤消息。
type Result<'TSuccess,'TFailure> =
| Success of 'TSuccess
| Failure of 'TFailure
綁定功能,在驗證綁定在一起
let bind switchFunction =
function
| Success s -> switchFunction s
| Failure f -> Failure f
你必須重寫您的驗證功能,以及。
let validAge (record:Record) =
if record.Age < 65 && record.Age > 18 then Success input
else Failure "Not the right age bracket"
現在用
checks |> List.reduce (fun acc elem -> acc >> bind elem)
無論哪種方式相結合,檢查出的原創文章。 還有更多你可能可以使用:)
編輯:我只是注意到,我再次寫這個答案太慢了。 此外,我認爲赫爾傑比我更好地解釋了這個概念。
要使用'>>'運算符,右側的函數必須將左側的結果類型作爲其參數。 'checkAge'返回'bool',但'checkWeight'期待'Person'。你想要最終的結果意味着什麼? – TeaDrivenDev
@TeaDrivenDev我想結合這些函數,所以我可以一次調用結果,而不是每次循環一次函數。這一切始於我試圖改進此F#片段頁面上的代碼... http://www.fssnip.net/7h –