Haskell高阶函数

时间:2016-12-06 17:32:06

标签: haskell functional-programming higher-order-functions recursion-schemes

我在Haskell上有关于高阶函数的作业,我在开始时遇到了一些麻烦。

如果我能就第一个问题得到一些帮助和解释,我相信我可以完成剩下的工作。

  

使用高阶函数(mapfoldfilter),如有必要   lambda表达式,写函数f1f2,使f1 (f2 (*) [1,2,3,4]) 5 ~> [5,10,15,20]

f1 = 
f2 = 

我想我必须使用部分应用的map,以便[1,2,3,4]成为[(*1),(*2),(*3),(*4)]

2 个答案:

答案 0 :(得分: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 :(得分:0)

如果你采取f2 = map,你会立即进入你想出的第一步:

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

现在我们只需要确定h是什么。 h需要具有(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