给定一个通用函数f:a->b->c
我想创建一个函数,它执行与 f 相同的操作/计算,但两个输入参数的顺序(或柯里顺序)交换。
因此,寻找g
进行与f
完全相同的计算的g:b->a->c
==
let transform1 (f:a->b->c) : (b->a->c) =
?
您可以这样定义swap
函数:
let swap f a b = f b a
您实际上可以从函数的类型中判断如何执行此操作。
transform1
具有类型(a -> b -> c) -> (b -> a -> c)
或等效地,(a -> b -> c) -> b -> a -> c
。
所以你正在寻找的是一个函数,它需要
- 一个我们称之为
f
的函数a -> b -> c
, - 和
b
, - 和一个
a
, - 然后"使用"
f
与a
和b
以产生c
.
由于只有一种方法可以将f
与产生c
的a
和b
一起使用,因此您可以这样写下:
flip f b a = f a b
仅此而已。
在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 ...