Haskell映射函数和lambda表达式

时间:2019-02-17 19:59:57

标签: haskell lambda haskell-platform

我在Haskell中有此表达式,现在我不确切了解如何应用它。输入j返回[2,3,4]

Error in optim(start, f, method = method, hessian = TRUE, ...) : 
non-finite finite-difference value [1]

1 个答案:

答案 0 :(得分: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表达式中的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]