$如何在高阶函数中使用?

时间:2016-02-13 00:44:05

标签: haskell

这涉及Learn you a Haskell for Great Good中遇到的一个例子,即这一个:

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

我试图理解它,但这对我没有意义。当然,函数列表将应用于输入(数字3),但我不知道$运算符如何帮助。我试图跟踪事物的应用顺序(如果有一个带有一步编译器的haskell IDE请告诉我)并且无法理解$如何正确关联允许翻转功能应用程序,即当我看到map这样的

map fun [1, 2 .. n]

我想想发生以下情况以形成输出列表

fun 1
fun 2
.
.
fun n

但是对于手头的例子,这是多么意义:

$3 4+

2 个答案:

答案 0 :(得分:6)

  

这有什么意义:

$3 4+
实际上,这实际上并不是意义。但这并不是它简化的内容!它简化为

($3) (4+)

这些是操作员部分

($ 3) ≡ \x -> x $ 3
(4+)  ≡ \x -> 4 + x
(10*) ≡ \x -> 10*x
(^2)  ≡ \x -> x^2

所以

($3) (4+) ≡ (\f -> f $ 3) (\y -> 4 + y)
          ≡ (\y -> 4 + y) $ 3 
          ≡ (\y -> 4 + y) 3
          ≡ 4 + 3

如果您想象出“漏洞”,也许更容易理解:

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

答案 1 :(得分:1)

operator $调用函数,该函数是其右手参数的左手参数。在使用示例时,它将值“放置”为列表

中各节的附加参数

因此($ 3) (4+)(4+3)。类似地($ 2) (4/)(4/2)

使用常规算术运算更容易掌握部分的使用。例如:(/2) 44/2相同,因此2