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

如何在已定义的F#函数中交换应用程序的顺序?,f#,functional-programming,F#,Functional Programming,给定一个通用函数f:a->b->c 我想创建一个函数,它执行与f相同的操作/计算,但两个输入参数的顺序(或货币顺序)交换 因此寻找g:b->a->c其中g的计算与f == 在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 实

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

我想创建一个函数,它执行与f相同的操作/计算,但两个输入参数的顺序(或货币顺序)交换

因此寻找
g:b->a->c
其中
g
的计算与
f

==


在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
  • 和a
    b
  • 和一个
    a
  • 然后将
    f
    a
    b
    一起“使用”,以生成
    c
因为只有一种方法可以将
f
a
和产生
c
b
一起“使用”
f
,所以您可以这样写:

flip f b a = f a b

就是这样。

我想作者的意思是他想把函数
f
作为参数,并返回翻转的版本。基本上就是“像我发布的那样返回
f
周围的lambda包装”?是的,对
f
非常抽象,所以
(\f a b->f b a)
函数是前奏的一部分。为什么不
let g=flip f in…
?问题是关于f#的,其中
flip
不是libI的一部分。我从问题中删除了Haskell标签,因为它似乎完全是关于f#的,甚至没有提到Haskell。
flip f b a = f a b