F#中具有不同参数的流水线功能

时间:2019-04-12 12:49:43

标签: 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

客户记录类型具有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

我收到这样的错误

enter image description here

如何对具有附加参数的函数进行管线处理?

1 个答案:

答案 0 :(得分:3)

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

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

Forward Pipe运算符会将您左侧的参数发送到右侧的函数。如果是您的上次呼叫,则您或客户的左侧是一个序列,但在右侧,您有一个带有参数的方法,因此您的序列将作为最后一个参数输入。

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