我在Haskell有一个关于高阶函数的作业,我在开始的时候遇到了一些小麻烦。
如果我能在第一个问题上得到一些帮助和解释,我相信我能完成剩下的。
使用高阶函数(
map、fold或filter),并在必要时使用lambda表达式,编写函数f1和f2,以便使f1 (f2 (*) [1,2,3,4]) 5 ~> [5,10,15,20]
f1 =
f2 = 我在想,我必须使用一个部分应用的map,这样[1,2,3,4]才能变成[(*1),(*2),(*3),(*4)]?
发布于 2016-12-06 18:00:49
我想我必须使用一个部分评估的地图,以便1,2,3,4变成*1,*2,*3,*4?
你的直觉让你更接近答案,所以这是个好兆头
话虽如此,你被赋予工作的表情真的很奇怪
f1 (f2 (*) [1,2,3,4]) 5我将按以下方式编写f1和f2
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-21 01:59:42
如果您使用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带的:
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]) 5https://stackoverflow.com/questions/41001405
复制相似问题