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



给定一个通用函数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
  • 然后"使用"fab以产生c.

由于只有一种方法可以将f与产生cab一起使用,因此您可以这样写下:

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 ...

最新更新