3

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

如果我能在第一个问题上得到一些帮助和解释,我相信我能完成剩下的。

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

f1 = 
f2 = 

我在想我必须使用部分应用map,这样[1,2,3,4]就变成了[(*1),(*2),(*3),(*4)]

4

2 回答 2

3

我在想我必须使用部分评估的地图,以便 [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]
于 2016-12-06T18:00:49.033 回答
1

如果您采取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,它看起来几乎像 a map,除了参数是flipped:

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
于 2016-12-21T01:59:42.670 回答