繁体   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