2016-12-06 31 views
1

我試圖建立了解系列嵌入式匿名錶達式,如最好的方法:瞭解Haskell中的嵌入式匿名函數?

(\f -> (\g -> (\x -> f (g x)))) 

在Haskell。我沒有用更簡單的表達式,如太麻煩:

(\x -> x + 1) 

其中指出,函數取一個號碼,並返回一個數字: Num a => a -> a

但是當事情被嵌入這樣我得到相當丟失。我試圖理解它是,匿名函數管道的參數從fgx馬上我應該開始編寫輸入,因爲它是使用變量的地方。但我已經嘗試了合理化四到五種不同的解釋,並且我一直在抓住最內層函數中看起來像遞歸函數調用的東西。

這個問題的打字是否可以通過簡單的方式解決?

回答

4

這只是一個柯里化的例子。 Haskell中提供語法糖爲這樣:

\f g x -> f (g x) 

在任一情況下,將所述函數應用於參數foo1的函數返回

\g x -> foo1 (g x) 

將此應用於函數foo2返回另一個功能

\x -> foo1 (foo2 x) 

其中,如果應用於另一個參數bar將返回由foo1 (foo2 bar)計算的值。


在像Python語言,它看起來像

compose1 = lambda f: lambda g: lambda x: f(g(x)) 

因爲Python功能默認情況下不令行禁止,這是從compose2 = lambda f,g,h: f(g(x))明顯 功能。兩個 之間的差異將是你如何使用它們。

compose1(foo1)(foo2)(bar) 
compose2(foo1, foo2, bar) 

寫出使用def語句,compose1看起來像

def compose1(f): 
    def _1(g): 
     def _2(x): 
      return f(g(x)) 
     return _2 
    return _1 
+0

謝謝! 'f g x - > f(g x)'確實「固定」了我的觀點。我現在明白了。 – Micrified

3

你不需要overthink這一點。 (\f -> (\g -> (\x -> f (g x))))只是一個參數的函數f某些結果 ......這又是一個函數,但它原則上與其結果是數字的函數沒有區別。這只是一些黑盒...

\f -> ██ 

現在,當你真正該拉姆達適用於一些f,您可以訪問的黑箱。例如,我可以把它應用到sqrt功能:

(\f -> ██) sqrt 
    ≡ ██ 
    = \g -> ██₂ 

好了,另一個lambda這將產生一些黑盒。讓我們看看用的是一個(^2)

(\g -> ██₂) (^2) 
    ≡ ██₂ 
    = \x -> ██₃ 

既然黑箱是不是太黑暗:這只是f (g x),其中fgx是我們已經應用參數:

(\f -> (\g -> (\x -> f (g x)))) sqrt (^2) 
    ≡ \x -> sqrt (x^2) 

當然這就是隻是一個例子。一般來說,你的大lambda需要兩個函數,並給你兩個函數的組合。當然,這是更好地寫成

\f g x -> f $ g x 

或事實上根本.

+0

謝謝。我沒有把它看作一個帶有兩個函數參數的函數組合。一旦我這樣做,這是有道理的! – Micrified

1

認爲整個lambda函數作爲一個黑盒子。從簽名我們知道有三個箭頭「 - >」分隔每個參數。這告訴你這個黑盒子接收3個實際參數:f g x。它將f應用於將g應用於x的結果。通過查看其命名的函數等價性更容易理解。

compose f g x = f (g x) 
compose' f g = \x -> f (g x)