【问题标题】:Pipelining functions with different parameters in F#F# 中具有不同参数的流水线函数
【发布时间】:2019-04-12 21:51:58
【问题描述】:

我有以下代码:

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

我收到这样的错误

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

【问题讨论】:

    标签: f#


    【解决方案1】:

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

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

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

    你的最后一条语句看起来像checkCustomerInBlockedList blockedList customers,这就是为什么改变参数的顺序会让编译器高兴。

    【讨论】:

      猜你喜欢
      • 2022-10-20
      • 2021-06-15
      • 1970-01-01
      • 2017-12-25
      • 1970-01-01
      • 2021-09-29
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多