return 元组的 F# 链接函数

F# Chaining functions that return tuple

我是 F# 的新手,正在尝试链接函数以创建高阶函数。

一个简化的例子是

init returns 一个元组

validate 接受一个元组并且 returns bool

    let init : string * string =
        ("1", "2")

    let validate ((a: string), (b: string)) : bool =
        a.Equals(b)

    let test = init >> validate

错误

This expression was expected to have type 'a -> 'b' but here has type 'string * string'

您只能使用 >> 组合器组合函数。你的第一个赋值不是一个函数——它是一个值的绑定——你的元组。 您只需添加空参数列表 () (unit) 参数即可将其转换为函数,如下所示:

let init() : string * string =
    ("1", "2")

let validate ((a: string), (b: string)) : bool =
    a.Equals(b)

let test = init >> validate

let res = test()

正如 Piotr 的回答所解释的那样,您收到错误是因为您有一个值和一个函数。要组合这些,您可以将 init 变成一个函数,但在这种情况下您实际上不需要使用组合。

如果您想将值作为参数传递给函数,通常将其作为参数传递会简单得多:

let res = validate init

或者,如果您有多个函数要按顺序应用于您的输入,您可以使用管道运算符执行此操作:

let res = init |> validate

使用 >> 的函数组合是一个很好的函数技巧,但我认为它在标准 F# 代码中实际上比大多数人想象的要少得多。我一直使用 |>,但很少使用 >>