多参数F#向后管道算子

多参数F#向后管道算子,f#,F#,刚开始学习F,目前正在阅读《F之书》。也许我遗漏了什么,但据我所知,前向/后向管道操作符正在将表达式的结果以前向/后向方向传递到下一个函数的最后一个参数中。但这为什么有效呢?它首先将y传递到x(将x视为一个函数),然后将xy传递到最后一个参数,例如减号的b。因此它应该返回一个闭包而不是一个int。但是backwardtest32返回1 let backwardTest x y = let minus a b = a - b minus <| x <| y let

刚开始学习F,目前正在阅读《F之书》。也许我遗漏了什么,但据我所知,前向/后向管道操作符正在将表达式的结果以前向/后向方向传递到下一个函数的最后一个参数中。但这为什么有效呢?它首先将
y
传递到
x
(将x视为一个函数),然后将
xy
传递到最后一个参数,例如减号的
b
。因此它应该返回一个闭包而不是一个int。但是
backwardtest32
返回
1

let backwardTest x y = 
    let minus a b = a - b
    minus <| x <| y
let backwardTest x y=
设负AB=a-b
负所以你有

minus <| x <| y
=minus x <| y
=(minus x) y
=minus x y

负哦,那么反向管道仍然按从左到右的顺序传递表达式?我认为它是按从右到左的顺序传递的。不,如果你不理解我的意思,或者甚至不理解我的意思,那么标准的
@stt106 if
y |>减号
,我想我理解你的意思,但是我仍然认为
x |>y |>减号
符合标准,尽管F#可以推断出
y
作为一个函数。有趣的是,我有这样一个函数,用完全相同的行测试forward pipeline操作符,它编译得很好,但它正在做我希望它做的事情。或者这是不是意味着我不明白你的意思?@stt106是的,它本身编译得很好,推断y是一个函数。然而,这个问题意味着y是一个int。也就是说,如果我们在问题中发布的函数中尝试
x |>y |>减号
,我们就不能再调用
backwardTest 3 2
,因为为y提供的参数并不像推理所期望的那样是一个函数。实际上,操作符首先应用第一个参数。查看我们有时如何在不对称函数(如减法、除法或模)的情况下应用非第一个函数;否则,认为反向管道操作符也从右向左传递参数可能是很自然的。感谢链接,进一步澄清了事情!关键是不要再认为这些操作符是神奇的东西。它们只是常规函数,就像其他函数一样。你甚至可以定义你自己的。事实上,这将是一个很有用的练习,可以了解发生了什么。@stt106,currying和partial应用程序已经非常可靠了。这只是关于应用第一个或前n个参数。您不能统一应用非第一个参数,因为非第一个参数可能看起来是第二个或第二十五个参数。我认为值得一提的是,F#的创建者Don Syme建议非常谨慎地使用后向管道操作符,或者根本不使用后向管道操作符。