一般給出一個函數f:a->b->c
如何在已定義的F#函數中交換應用程序的順序?
我希望創建一個做同樣的事情/計算使得f並不但與兩個輸入參數(或鑽營順序)的順序調換周圍的功能。
所以尋找g:b->a->c
其中g
不完全相同的計算爲f
==
let transform1 (f:a->b->c) : (b->a->c) =
?
一般給出一個函數f:a->b->c
如何在已定義的F#函數中交換應用程序的順序?
我希望創建一個做同樣的事情/計算使得f並不但與兩個輸入參數(或鑽營順序)的順序調換周圍的功能。
所以尋找g:b->a->c
其中g
不完全相同的計算爲f
==
let transform1 (f:a->b->c) : (b->a->c) =
?
實際上,你可以從功能如何做到這一點的類型告訴。
transform1
具有類型(a -> b -> c) -> (b -> a -> c)
或等同於(a -> b -> c) -> b -> a -> c
。
所以你要找的是一個函數,
a -> b -> c
我們稱之爲f
,b
,a
,f
與a
和b
以產生c
。由於只有一個「用」 f
與a
方式和產生你寫這樣下來c
的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 ...
我認爲作者的意思是他想把函數'f'作爲參數並返回翻轉版本。 –
這基本上是「像'我發佈'一樣返回lambda包裝'? – user268396
亞,非常抽象的'f',所以'(\ fab - > fba)' –
你可以這樣定義一個函數swap
:
let swap f a b = f b a
我已經從問題中刪除了Haskell標記,因爲它似乎完全是關於F#的,並且甚至沒有提及Haskell。 – scrwtp