如何在定义的 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
其中 g
与 f
进行完全相同的计算
==
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"
f
与 a
和 b
以产生 c
.
因为只有一种方法可以 "use" f
使用 a
和 b
产生 c
你把那个写下来:
flip f b a = f a b
就是这样。
给定一个通用函数f:a->b->c
我想创建一个与 f 功能相同 thing/computation 的函数,但两个输入参数的顺序(或柯里化顺序)互换。
所以寻找 g:b->a->c
其中 g
与 f
==
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"
f
与a
和b
以产生c
.
因为只有一种方法可以 "use" f
使用 a
和 b
产生 c
你把那个写下来:
flip f b a = f a b
就是这样。