[英]Haskell map functions and lambda expressions
我在Haskell中有這個表達式,現在我不明白它是如何應用的。 輸入j返回[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
並返回函數的函數。 因此它將返回一個函數,該函數采用映射到x + a
的參數x
。 因此,這意味着第二個map
生成一個函數列表 。 的確,所以上面的表達式相當於:
[(+1), (+2), (+3)]
或者更詳細:
[\x -> x+1, \x -> x+2, \x -> x+3]
這里lambda表達式中的x
s是不同的變量。
現在第一個映射采用這些函數,並在調用值為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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.