[英]How does function composition (.) work from within?
我正在研究Haskell。 目前,我正在研究功能構成。 我理解(至少在基本層面上)如何使用函數(.)
,但有兩件事我不理解。
所以函數看起來如下:
(.) :: (b -> c) -> (a -> b) -> a -> c
f . g = \x -> f (g x)
首先是類型聲明。 (b -> c) -> (a -> b)
實質上意味着函數f
從函數g
結果值( b
)中取一個參數(取值a
)並返回類型c
值。 我不明白以下部分-> a -> c
,為什么要有-> a
那里? 為什么(b -> c) -> (a -> b) -> c
錯了? 從我的觀點(這顯然是錯誤的),函數g
已經采取a
作為參數。
二,功能體f . g = \\x -> f (gx)
f . g = \\x -> f (gx)
。 \\x ->
在這做什么? Lambda非常簡單。 例如filter (\\(a,b) -> a + b > 4) [(1,2),(3,4)]
,但是簡單的\\x ->
讓我卡住了。 我可能會寫這樣的身體f . (gx) = f (gx)
f . (gx) = f (gx)
(這顯然是錯誤的)。
(b -> c) -> (a -> b) -> c
將是一個函數,它接受兩個函數f :: b -> c
和g :: a -> b
,並以某種方式調用g
而沒有初始參數輸入a
。
對於第二個問題,請考慮如何使用前綴表示法來定義(.)
。 (可能更容易看出我們是否為該函數使用“常規”名稱;我將在每個代碼片段后將其包含為注釋):
(.) f g x = f (g x) -- compose f g x = f (g x)
x
是(.)
的“第三個參數”,或者更准確地說是(.) fg
返回的函數的參數。 這相當於直接將(.) fg
定義為函數,方法是在右側放置一個函數,而不是該函數的最終返回值:
(.) f g x = f (g x) -- Implicit function def: compose f g x = f (g x)
(.) f g = \x -> f (g x) -- Explicit function def: compose f g = \x -> f (g x)
您還可以使用括號隱式定義函數:
(f . g) x = f (g x)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.