Haskell映射函数和lambda表达式

问题描述 投票:3回答:1

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

j :: [Int]
j = map (\a -> a 1) (map (\a x -> x + a) [1,2,3])
haskell lambda haskell-platform
1个回答
4
投票

这里有两个地图,让我们先分析子表达式:

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

我们可以用一种形式编写lambda表达式,这种形式可能更适合上述情况:

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

所以这是一个函数,它接受一个参数a并返回一个函数。因此它将返回一个函数,该函数采用映射到x的参数x + a。因此,这意味着第二个map产生一个函数列表。的确,所以上面的表达式相当于:

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

或者更详细:

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

这里lambda表达式中的xs是不同的变量。

现在第一个映射采用这些函数,并在调用值为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]
© www.soinside.com 2019 - 2024. All rights reserved.