簡體   English   中英

需要幫助理解haskell中的函數應用程序運算符

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM