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# 代码中实际上比大多数人想象的要少得多。我一直使用 |>
,但很少使用 >>
。
我是 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# 代码中实际上比大多数人想象的要少得多。我一直使用 |>
,但很少使用 >>
。