gpt4 book ai didi

f# - 面向铁路的编程 - 函数输出不通过

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

我一直在努力通过 this article on ROP ,并已到达“将简单函数转换为面向铁路的编程模型”部分,他解释了如何将其他类型的函数放入模型中。

他举了一个例子想清理一个邮箱地址(函数名和我英文不一样!)...

let cleanEmail person =
printfn "Cleaning email for \"%s\"" person.Name
let newPerson = { person with Email = person.Email.Trim().ToLower() }
printfn " email is now \"%s\"" newPerson.Email
newPerson

我添加了一些 printfn 来查看发生了什么。这个函数工作正常,因为如果我向它传递一个带有大写字母和/或前导/尾随空格的电子邮件的输入,输出是一个带有干净的小写电子邮件地址的值...

let shouter = { Name = "Jim"; Email = "  JIM@SHOUT.com "}
cleanEmail shouter

给出输出...

Cleaning email for "Jim"
email is now "jim@shout.com"
val it : Request = {Name = "Jim";
Email = "jim@shout.com";}

但是,如果我将此函数包装在一个开关中,并将其插入验证函数链中,则会使用原始电子邮件地址。例如,使用这样的验证函数...

let validateNameNotBlank person =
printfn "Validating name not blank for \"%s\"" person.Name
if person.Name = "" then Failure "Name must not be blank"
else Success person

...像这样的运算符...

let (>=>) switch1 switch2 input =
match switch1 input with
| Success s -> switch2 input
| Failure f -> Failure f

...并像这样捆绑在一起...

let validate =
validateNameNotBlank
>=> validateNameLength
>=> switch cleanEmail
>=> validateEmail

...然后当我传递 shouter 时,我得到以下信息...

Validating name not blank for "Jim"
Validating name length for "Jim"
Cleaning email for "Jim"
email is now "jim@shout.com"
Validating email for "Jim" ( JIM@SHOUT.com )
val it : Result<Request,string> = Success {Name = "Jim";
Email = " JIM@SHOUT.com ";}

从我放入的 printfn 中可以看出,cleanEmail 函数正在清理电子邮件,但输出显示原始电子邮件已传递给链中的下一个函数。

我在这里错过了什么?

最佳答案

如果你看文章,运算符有定义

let (>=>) switch1 switch2 x = 
match switch1 x with
| Success s -> switch2 s
| Failure f -> Failure f

如果正确翻译成您的变量是:

let (>=>) switch1 switch2 input =
match switch1 input with
| Success s -> switch2 s
| Failure f -> Failure f

您实际上从未使用过 Success 中的 s,因此相同的输入只会不断传递。

仔细检查 >=> 的类型会发现这个问题,因为您的类型会给 switch1switch2 什么时候它们应该有不同的类型。

关于f# - 面向铁路的编程 - 函数输出不通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35833754/

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