2

我在Haskell中有更高階函數的作業,我在入門時遇到了一些麻煩。Haskell高階函數

如果我能在第一個問題上得到一些幫助和解釋,我相信我能完成其餘的工作。

使用高階函數(mapfold,或filter),並在必要時 lambda表達式,寫功能f1f2這樣f1 (f2 (*) [1,2,3,4]) 5 ~> [5,10,15,20]

f1 = 
f2 = 

我想我必須使用部分應用map,以便[1,2,3,4]變成[(*1),(*2),(*3),(*4)]

+0

我說你應該用'F1 GN = gn'然後寫F2,使得'F2(+)[1..4] 5 =啓動= [5,10,15,20]' – Ingo

+1

是的,'f2 =地圖'聽起來像個好主意。 – Bergi

回答

2

我想我必須使用部分評估的地圖,使[1,2,3,4]變成[* 1,* 2,* 3,* 4]?

你的直覺讓你更接近答案,所以這是一個好兆頭

這就是說,你給與之合作的表達是很奇怪的

f1 (f2 (*) [1,2,3,4]) 5 

我會寫f1f2如下

let f1 = \xs n -> map (\f -> f n) xs 
    f2 = map 
in f1 (f2 (*) [1,2,3,4]) 5 
-- [5,10,15,20] 
+1

如果你想要看上,'f1 = flip(map。flip($))':-D – Bergi

+1

你的回答沒有任何解釋 – luqui

0

如果你把f2 = map,你IMMED iately去的第一步,你想出來的:

f2 (*) [1, 2, 3, 4] = 
map (*) [1, 2, 3, 4] = 
[(1 *), (2 *), (3 *), (4 *)] 

現在給出的倍增器功能的這份名單中,我們需要

f1 [g1, g2, ..., gn] x = 
[g1 x, g2 x, ..., gn x] 

從那以後,我們可以把它在f2 (*) [1..4]得到

f1 [(1 *), (2 *), (3 *), (4 *)] 5 = 
[1 * 5, 2 * 5, 3 * 5, 4 * 5] = 
[5, 10, 15, 20] 

這就是你所追求的。

如果你看一下f1,它看起來幾乎像一個map,除了參數是flip PED:

f1 = \gs x -> map h gs 

現在我們只需要弄清楚什麼是hh需要是一個像(2 *)這樣的函數,並給出將該函數應用於5的結果;即h = \g -> g 5

全部放在一起,我們得到

let f2 = map 
    f1 = \gs x -> map (\g -> g x) gs 
in f1 (f2 (*) [1, 2, 3, 4]) 5