如何在定义的 F# 函数中交换应用程序的顺序?

How can I swap the order of application in a defined F# function?

给定一个通用函数f:a->b->c

我想创建一个与 f 功能相同 thing/computation 的函数,但两个输入参数的顺序(或柯里化顺序)互换。

所以寻找 g:b->a->c 其中 gf

进行完全相同的计算

==

let transform1 (f:a->b->c) : (b->a->c) = 
?

在 Haskell 你会这样做:

g b a = f a b -- or using lambda expressions: (\b a -> f a b) 

所以在 let 语句中:let g = (\b a -> f a b) in ...

您可以这样定义一个 swap 函数:

let swap f a b = f b a 

你实际上可以从函数的类型中看出如何做到这一点。

transform1 具有类型 (a -> b -> c) -> (b -> a -> c) 或等效地 (a -> b -> c) -> b -> a -> c.

所以你要找的是一个需要

的函数
  • 一个函数 a -> b -> c 我们称之为 f,
  • 还有一个b,
  • 和一个a
  • 然后 "uses" fab 以产生 c.

因为只有一种方法可以 "use" f 使用 ab 产生 c 你把那个写下来:

flip f b a = f a b

就是这样。