gpt4 book ai didi

F# 常量模式匹配和检查消除

转载 作者:行者123 更新时间:2023-12-04 17:33:18 25 4
gpt4 key购买 nike

我对 F# 世界很陌生,目前正在尝试使用函数。试图找到新的技术,使它们更加紧凑和灵活,并摆脱了类似 C# 的编码风格。
所以我有一个非常丑陋的代码,不断检查和模式匹配:

type StringChecking =
| Success of string
| Fail

let StringProcessor(str : string) =
let newstr = modifyFn str
let result = checkFn newstr
match result with
| true -> Success result
| false ->
let newstr' = modifyFn' str
let result' = checkFn newstr'
match result' with
| true -> Success newstr'
| false ->
let newstr'' = modifyFn'' str
let result'' = checkFn newstr''
match result'' with
| true -> Success newstr''
| false ->
Fail

是否有一些有用的技术可以帮助我消除所有这些阶段并使我的代码更加优雅。对不起,如果这个问题看起来很尴尬或愚蠢,但我真的很想用这个做点什么,因为我想在我的某个项目中使用它。我已经厌倦了 C# 中的不断检查。感谢您的时间和建议。

最佳答案

成功之路
enter image description here

这是假设目标是在一系列步骤中重复转换对象,只有在成功完成前一个步骤时才会执行下一步。这将被 F# 的 Option 封装。在此输入。

如果你追求简洁,你可能会比使用某种单子(monad)更糟糕 bind .

let (>>=) arg f =   // bind operator
match arg with
| Some x -> f x
| None -> None

let checkWith checker x =
if checker x then Some x else None
"sample String"
|> (modifyFn >> checkWith checkFn)
>>= (modifyFn' >> checkWith checkFn')
>>= (modifyFn'' >> checkWith checkFn'')

但是您确实注意到流水线中尴尬的第一步。这是计算开始时展开的值的结果。因此:
Success "sample String"
>>= (modifyFn >> checkWith checkFn)
>>= (modifyFn' >> checkWith checkFn')
>>= (modifyFn'' >> checkWith checkFn'')

如果您想修改和验证相同的原始值而不是上一步的结果,我们就忽略它。
let str ="sample String"
modifyFn str |> checkWith checkFn
>>= (fun _ -> modifyFn' str |> checkWith checkFn')
>>= (fun _ -> modifyFn'' str |> checkWith checkFn'')

替代路径
enter image description here

如果计算随着步骤的成功完成而终止,否则要继续执行替代步骤,我们将有不同的签名。类似于 F# 的 defaultArg函数( arg:'T option -> defaultvalue:'T > 'T ),我将提出一个类似绑定(bind)的 defaultBy :
let defaultBy c a f =
match a with
| None -> f c
| x -> x
let (>?=) f = defaultBy "sample string" f

"sample string"
|> (modifyFn >> checkWith checkFn)
>?= (modifyFn' >> checkWith checkFn')
>?= (modifyFn'' >> checkWith checkFn'')

关于F# 常量模式匹配和检查消除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35611085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com