Haskell 映射函数和 lambda 表达式

Haskell map functions and lambda expressions

我在 Haskell 中得到了这个表达式,现在我不明白它是如何应用的。输入 j returns [2,3,4]

j :: [Int]
j = map (\a -> a 1) (map (\a x -> x + a) [1,2,3])

这里有两个映射,我们先分析一下子表达式:

map (\a x -> x + a) [1,2,3]

我们可以将 lambda 表达式写成一种可能更适合上述情况的形式:

map (\a -> (\x -> x + a)) [1,2,3]

所以这是一个接受参数 a 和 return 的函数。因此它将 return 一个函数,该函数采用映射到 x + a 的参数 x。因此,这意味着第二个 map 会生成一个 函数列表 。确实如此,所以上面的表达式等价于:

[(+1), (+2), (+3)]

或更详细:

[\x -> x+1, \x -> x+2, \x -> x+3]

此处 lambda 表达式中的 x 是不同的变量。

现在第一个映射采用这些函数,并在调用值为 1 的函数时映射这些函数,因此,这个表达式:

map (\a -> a 1) [(+1), (+2), (+3)]

相当于:

[(+1) 1, (+2) 1, (+3) 1]

因此相当于:

[2,3,4]

如你所见。

我们可以在语法上将这个函数简化为:

j :: Num a => [a]
j = map ($ 1) (map (+) [1,2,3])

在语义上等同于:

j :: Num a => [a]
j = map (+1) [1,2,3]

因此:

j :: Num a => [a]
j = [2,3,4]