如何在已定义的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