首页 > 解决方案 > F# 中具有不同参数的流水线函数

问题描述

我有以下代码:

type CustomerStatus = |Valid |Invalid 
type Customer = {Id:int; FirstName: string; LastName:string; Status: CustomerStatus}

let checkCustomerFirstName (customers: Customer seq) =
    customers

let checkCustomerLastName (customers: Customer seq) =
    customers

let checkCustomerInBlockedList (customers: Customer seq) (blockedList: string seq) =
    customers

Customer 记录类型有 4 个属性:Id、FirstName、LastName 和 Status。CustomerStatus 在上面的行中定义为具有有效和无效的 DU。然后我有三个函数来验证一系列客户,为了简洁起见,我省略了函数体。请注意,第三个函数接受第二个参数 - 一个字符串列表,用于比较客户姓名以查看它们是否无效。

下面是一些测试数据:

let customers =
    [
        {Id=0;LastName="Customer0";FirstName="Test";CustomerClass=Valid}
        {Id=1;LastName="Customer1";FirstName="Test";CustomerClass=Valid}
        {Id=2;LastName="Customer2";FirstName="Test";CustomerClass=Valid}
        {Id=3;LastName="Customer3";FirstName="Test";CustomerClass=Valid}
        {Id=4;LastName="Customer4";FirstName="Test";CustomerClass=Valid}
    ]

let blockedList = ["Customer3"]

当我像这样流水线化前两个函数时:

customers
|> checkCustomerFirstName
|> checkCustomerLastName

一切都按预期工作。但是,当我添加第三个功能时,

customers
|> checkCustomerFirstName
|> checkCustomerLastName
|> checkCustomerInBlockedList blockedList

我收到这样的错误

在此处输入图像描述

如何流水线化具有附加参数的函数?

标签: f#

解决方案


您可以尝试更改最后一个方法参数的顺序。

let checkCustomerInBlockedList (blockedList: string seq) (customers: Customer seq) =
    customers

正向管道运算符将左侧的参数发送到右侧的函数。如果您最后一次调用,您有或左侧有一个客户序列,但在右侧您有一个带参数的方法,因此您的序列将作为最后一个参数提供。

您的最后一条语句看起来就像checkCustomerInBlockedList blockedList customers这就是为什么更改参数的顺序会使编译器高兴的原因。


推荐阅读