2015-05-04 52 views
1

一般給出一個函數f:a->b->c如何在已定義的F#函數中交換應用程序的順序?

我希望創建一個做同樣的事情/計算使得f並不但與兩個輸入參數(或鑽營順序)的順序調換周圍的功能。

所以尋找g:b->a->c其中g不完全相同的計算爲f

==

let transform1 (f:a->b->c) : (b->a->c) = 
? 
+0

我已經從問題中刪除了Haskell標記,因爲它似乎完全是關於F#的,並且甚至沒有提及Haskell。 – scrwtp

回答

5

實際上,你可以從功能如何做到這一點的類型告訴。

transform1具有類型(a -> b -> c) -> (b -> a -> c)或等同於(a -> b -> c) -> b -> a -> c

所以你要找的是一個函數,

  • 功能a -> b -> c我們稱之爲f
  • b
  • a
  • 和然後使用fab以產生c

由於只有一個「用」 fa方式和產生你寫這樣下來cb

flip f b a = f a b 

,就是這樣。

2

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

+0

我認爲作者的意思是他想把函數'f'作爲參數並返回翻轉版本。 –

+0

這基本上是「像'我發佈'一樣返回lambda包裝'? – user268396

+0

亞,非常抽象的'f',所以'(\ fab - > fba)' –

6

你可以這樣定義一個函數swap

let swap f a b = f b a 
相關問題