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