[英]Need help in understanding the function application operator in haskell
這是一段代碼
map ($ 3) [(4+), (10*), (^2), sqrt]
給出輸出
[7.0,30.0,9.0,1.7320508075688772]
我知道$具有最低優先級,因此$右邊的表達式一起評估。 但我不明白的是($ 3)如何表現為一個函數(因為Map將函數和列表作為參數)。 我不明白為什么列表中的每個函數都應用於3。
請記住($)
實際上是一個函數:
($) :: (a -> b) -> a -> b
f $ x = f x
($ 3)
是\\f -> (f $ 3)
簡寫。 它的類型? 好:
3 :: Double -- for sake of simplicity
($) :: (a -> b) -> a -> b
($ 3) :: (Double -> b) -> b
所以($ 3)
是一個函數,它將函數從Double
為某個函數並將該函數應用於3
。 現在,如果我們使用map
,我們最終得到:
map ($ 3) [(4+), (10*), (^2), sqrt]
= [($ 3) (4+), ($ 3) (10*), ($ 3)(^2), ($ 3) sqrt]
= [(4+) $ 3, (10*) $ 3, (^2) $ 3, sqrt $ 3]
= [4 + 3, 10 * 3, 3 ^ 2, sqrt 3]
= [7, 30, 9, sqrt 3]
我們先來看一下($)
的類型簽名:
ghci>> :t ($)
($) :: (a -> b) -> a -> b
和定義:
($) f x = f x
要么:
f $ x = f x
在上面,我們有一個部分 ,我們創建了一個部分應用的($)
版本,第二個參數(類型為a
)設置為3
。 現在,我們知道3
類型為Num a => a
,因此我們的部分應用程序的類型簽名必須是Num a => (a -> b) -> b
。
接下來,讓我們看一下列表中的每個函數,每個函數都是($ 3)的參數。 正如預期的那樣,它們是函數,事實證明它們的類型Num a -> a -> a
實際上比所需的更受約束(所以我們很好)。 為了清楚起見,我們可以看看一個應用程序會帶來什么:
($3) (4+)
我們可以在沒有以下部分的情況下重寫:
($) (4+) 3
從上面的函數定義中可以清楚地了解應用程序的進展情況。
最后一個令人困惑的部分可能是關於列表的類型($3) (4+)
評估為7
,而不是repl中的7.0
。 如果我們記得列表是同類的並且注意到列表中的一個函數sqrt
接受並返回浮點值,我們會看到對所有應用程序強制執行此類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.