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