gpt4 book ai didi

f# - 如何编写函数列表?

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

如果我有一个名为 Person 的类型和函数列表,例如...

let checks = [checkAge; checkWeight; checkHeight]

...其中每个函数都是类型(Person -> bool),我想做等同于...

checkAge >> checkWeight >> checkHeight

...但是我事先不知道列表中有哪些功能,我该怎么做?

我尝试了以下...

checks |> List.reduce (>>)

...但这会产生以下错误...

error FS0001: Type mismatch. Expecting a (Person -> bool) -> (Person -> bool) -> Person -> bool

but given a

(Person -> bool) -> (bool -> 'a) -> Person -> 'a

The type 'Person' does not match the type 'bool'

我做错了什么?

最佳答案

看起来像Railway oriented programming会很适合这里。如果你选择走这条路,你基本上有两个选择。您可以全力以赴,也可以走捷径。

快速路线

您重写验证函数以采用Person 选项 而不是普通的Person

let validAge (record:Record option) = 
match record with
| Some rec when rec.Age < 65 && rec.Age > 18 -> record
| None -> None

现在您应该能够轻松地链接您的函数。

checks |> List.reduce (>>)

全力以赴

或者,如果您比较懒,不想在每个验证函数中都匹配 .. with,您可以多写一些代码。(样本取自 [ 1 ])

首先需要进行一些设置。我们将定义一个特殊的返回类型,以便我们可以获得有意义的错误消息。

type Result<'TSuccess,'TFailure> = 
| Success of 'TSuccess
| Failure of 'TFailure

绑定(bind)函数,将验证绑定(bind)在一起

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) 

无论哪种方式,请查看原始文章。还有更多你可以使用的:)

编辑:我刚刚注意到我再次写这个答案的速度太慢了。此外,我认为 Helge 对概念的解释也比我更好。

关于f# - 如何编写函数列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35782963/

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