簡體   English   中英

Haskell參數應用程序通過'map'中的'$ x'到inflix運算符函數列表。 它是如何工作的?

[英]Haskell argument application through '$x' in 'map' to a list of inflix operator functions. How does it work?

我只是想知道,出於對這種功能的好奇,下面的中間表達是某種優化的結果嗎? 我確實知道$實際上是一個函數,僅提供了一個參數。 通過某種方式,通過將此功能應用於“ map”提供的列表中的功能,它設法看到“ $”功能恰恰缺少一個功能,正如我所提到的,“ $ map”提供了該功能。 這種優化行為對帶有$的功能應用程序來說是唯一的嗎? 因為,對於它的價值,我無法從“ map”和“ $”的函數定義中看出來,這在下面為方便起見而提供。

從一開始,似乎'$ 3'應該出現在函數表達式之前,但此類表達式不會在編譯器中求值。 這是優化的擴展中間表達,它似乎正在發生:

[(4+) $3, (10*) $3, (^2) $3, sqrt $3]

定義-$

($) :: (a -> b) -> a -> b  
f $ x = f x

定義-地圖

map :: (a -> b) -> [a] -> [b]  
map _ [] = []  
map f (x:xs) = f x : map f xs  

使用的例子

map ($ 3) [(4+), (10*), (^2), sqrt]

返回結果

[7.0,30.0,9.0,1.7320508075688772]

如果我正確理解了您的問題,您想知道如果寫($ 3)會發生什么?

Haskell語法具有一個稱為“ 中綴運算符的部分 ”的概念。 這意味着,如果您使用運算符(此處為+ )編寫表達式,則:

(2 +) == \x -> 2 + x == (+) 2
(+ 2) == \x -> x + 2 == flip (+) 2

Haskell是一種功能編程語言。 函數式編程語言的各個方面之一是可以將函數用作參數。 這不限於函數式編程語言:在Java,C#,C ++等中,您可以將函數/方法引用傳遞給函數/方法,例如,使用參數調用這些函數。

所以你寫了:

map (\x -> ($) x 3) [(4+), (10*), (^2), sqrt]

\\x -> ($) x 3只是一個普通函數。 因此,如果將其應用於第一個參數,則會得到:

(\x -> ($) x 3) (4+)
-> ($) (4+) 3
-> (4+) 3
-> 4 + 3
-> 7

因此($ 3)情況沒有什么特別的,它適用於任何運算符,而我們只填寫運算符的右側。

實際上,您已經在(^2)使用了該概念。 您的列表實際上如下所示:

map (flip ($) 3) [(+) 4, (*) 10, flip (^) 2, sqrt]

因此,您在列表的元素中使用了左右兩部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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