【问题标题】:Haskell Higher Order FunctionsHaskell 高阶函数
【发布时间】:2017-04-21 10:46:13
【问题描述】:

我在 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)]

【问题讨论】:

  • 我想说你应该从f1 g n = g n开始,然后写f2这样f2 (+) [1..4] 5 == [5,10,15,20]
  • 是的,f2 = map 听起来是个好主意。

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


【解决方案1】:

我想我必须使用部分评估的地图,以便 [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]

【讨论】:

  • 如果你想变得花哨,f1 = flip (map . flip ($)) :-D
  • 你的回答说明不了什么
【解决方案2】:

如果您选择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,除了参数是flipped:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-13
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多