Sve*_*fer 3 lambda haskell haskell-platform
我在Haskell中有此表达式,现在我不完全了解如何应用它。输入j返回[2,3,4]
j :: [Int]
j = map (\a -> a 1) (map (\a x -> x + a) [1,2,3])
Run Code Online (Sandbox Code Playgroud)
这里有两个映射,让我们首先分析子表达式:
map (\a x -> x + a) [1,2,3]
Run Code Online (Sandbox Code Playgroud)
我们可以用一种对上述情况更好的形式编写lambda表达式:
map (\a -> (\x -> x + a)) [1,2,3]
Run Code Online (Sandbox Code Playgroud)
因此,这是一个带有参数a
并返回一个函数的函数。因此它将返回一个函数,该函数带有一个x
映射到的参数x + a
。因此,这意味着第二个函数map
产生了一个函数列表。实际上,因此上面的表达式等效于:
[(+1), (+2), (+3)]
Run Code Online (Sandbox Code Playgroud)
或更详细:
[\x -> x+1, \x -> x+2, \x -> x+3]
Run Code Online (Sandbox Code Playgroud)
这里,x
lambda表达式中的s是不同的变量。
现在,第一个映射使用这些函数,并在调用值为1的函数时将它们映射,因此,此表达式:
map (\a -> a 1) [(+1), (+2), (+3)]
Run Code Online (Sandbox Code Playgroud)
等效于:
[(+1) 1, (+2) 1, (+3) 1]
Run Code Online (Sandbox Code Playgroud)
因此等同于:
[2,3,4]
Run Code Online (Sandbox Code Playgroud)
如您所知。
我们可以将该函数从语法上简化为:
j :: Num a => [a]
j = map ($ 1) (map (+) [1,2,3])
Run Code Online (Sandbox Code Playgroud)
在语义上等效于:
j :: Num a => [a]
j = map (+1) [1,2,3]
Run Code Online (Sandbox Code Playgroud)
因此:
j :: Num a => [a]
j = [2,3,4]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
348 次 |
最近记录: |