【问题标题】:Haskell: Are list comprehensions higher order functions?Haskell:列表推导是高阶函数吗?
【发布时间】:2015-03-15 00:31:18
【问题描述】:

我有一个任务,我们不应该使用任何高阶函数,列表推导可以归类为高阶函数吗?

【问题讨论】:

  • 我认为这是有争议的,在现实中,只有完成任务的人才能判断是否允许。
  • 我不能说是,但我也不能说不;列表推导不是函数(应该可以安全地用于您的作业)。
  • 我的感觉是“不要使用高阶函数”的限制可能意味着强迫学生使用显式递归。不过,这不是很清楚。

标签: list haskell functional-programming list-comprehension


【解决方案1】:

Haskell 中的列表理解只是语法糖。它在 Haskell 2010 报告 here 中定义如下:

[ e | True ]          = [e]
[ e | q ]             = [ e | q, True ]
[ e | b, Q  ]         = if b then [ e | Q ] else []
[ e | p <- l, Q ]     = let ok p = [ e | Q ]
                            ok _ = []
                        in concatMap ok  l
[ e | let decls, Q ]  = let decls in [ e | Q ]

注意Q 在模式中的使用,它的范围超过了限定符(可以包括函数)。所以答案是肯定的,列表推导是高阶的。

【讨论】:

  • 报告的List Comprehensions 部分给出了一种可能的翻译(假设没有语言扩展),并且根本没有提及Monad;它确实使用了concatMap,它恰好类似于monad 的绑定,但它可以是完全独立的。当然concatMap(&gt;&gt;=) 一样是一个高阶函数。
  • @DanielWagner 我的信息来自this wiki page。但报告当然应该是判断的依据。我将编辑我的答案。
  • @d3dave 使用高阶函数来定义某些东西并不会使其高阶。我可以说ys = map f xs,它使用更高阶的map,但这并不会使ys 更高阶。
  • @Abhay:是的,但是列表推导中的Q 超出了限定符的范围,可以包含函数,并在ok 函数中使用。因此,也许在模式中提及Q 的用法会更正确。
  • 我的意思是说,无论里面使用什么,列表推导的结果都是一个列表。并且列表是一个非函数值,所以零序。
【解决方案2】:

“高阶”有一个特定的含义。如果一个函数接受一个函数的参数(或返回一个函数),则前者被称为高阶。(例如:map。)

列表推导式是表示列表值的表达式,而不是函数。所以答案是:没有。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 2011-12-13
    • 2018-04-02
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多