当前位置: 首页 > 知识库问答 >
问题:

“列表理解”可以被视为“函数式编程”吗?

施恩
2023-03-14

Scala code:

for {
   user <- users
   name <- user.names
   letter <- name.letters
} yield letter

我们可以将这种“列表理解”代码视为“函数式编程”风格吗?因为它们将被转换为mapflatMap

共有3个答案

廉展鹏
2023-03-14

我们可以将这种“列表理解”代码视为“函数式编程”风格吗?

具有命令式/生成器语法的一元列表推导是一种相对较新的语法和语义创新。

最初的列表理解(例如NPL或Miranda)是在集合理解的基础上建模的,并且显然是声明性的构造,尽管它被翻译成嵌套函数。

Haskell的列表理解功能类似。

如果我们认为单子是一个功能结构,那么单子理解(编译成单子守卫和绑定)肯定应该被认为是功能的。

徐子石
2023-03-14
匿名用户

列表理解结构经常出现在函数式编程语言中,但它与函数式编程没有区别。如果你也这样想的话,Python、PHP(5.5版)和下一个Javascript版本(ES6)也有类似的结构,但这并不意味着它们是功能性的。

在scala的例子中,你的例子可以转换成map和flatMap应用程序,但是这还不足以说明它是功能性的。考虑这种情况:

for {
  i <- 1 until 10
} println(i)

这仍然是一个需要理解的问题,但是它实际上和任何命令式语言一样有副作用(这个循环实际上转化为< code>foreach调用)。

在我看来,归根结底,函数式编程与结构无关,而与风格有关:一段代码采用FP风格,真正重要的是没有副作用(或者,在许多情况下,诚实地说,副作用何时发生)。

如果你愿意,你甚至可以在Java 7中实现FP:使用匿名类作为闭包,将所有东西都标记为final,避免任何可变状态,并将副作用隔离到特殊的构造中,这样就完成了。它会非常冗长,而且可能很难看,因为这种语言不支持有助于使这种风格在实践中变得更好的抽象,但它仍然是函数式的。

童子明
2023-03-14

是的,这绝对是一种函数式技术,特别是假设所有这些成员都是字段或纯函数。它只是0个或更多 flatMap的语法糖,后跟 1 个 mapif 子句转换为 withFilter)。

如果末尾没有rent,它的行为更像的命令式,转换为1个或多个foreachs;Foreach通常用于执行语句以消除其副作用。

本文更详细地描述了语法,这个优秀的答案用一些一元理论更深入地讨论了它,本文明确地描述了实际的规则翻译。

 类似资料:
  • 本文向大家介绍Java函数式编程(三):列表的转化,包括了Java函数式编程(三):列表的转化的使用技巧和注意事项,需要的朋友参考一下 列表的转化 将集合转化成一个新的集合就和遍历它一样简单。假设我们要将列表中的名字转化成全大写的。我们看下都有哪些实现方式。 Java中的字符串是不可变的,所以它没法改变。我们可以生成新的字符串,用来替换列表中原有的元素。然而这样做的话,原来列表就没了;还有一个问题

  • 本文向大家介绍详解JAVA 函数式编程,包括了详解JAVA 函数式编程的使用技巧和注意事项,需要的朋友参考一下 1.函数式接口 1.1概念: java中有且只有一个抽象方法的接口。 1.2格式: 1.3@FunctionalInterface注解: 与 @Override 注解的作用类似,Java 8中专门为函数式接口引入了一个新的注解: @FunctionalInterface 。该注 解可用于

  • 本文向大家介绍Python3中lambda表达式与函数式编程讲解,包括了Python3中lambda表达式与函数式编程讲解的使用技巧和注意事项,需要的朋友参考一下 简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。其一般有如下几种使用方式: 1、lambda的一般形式是关键字lambda后面跟一个或多个参数,紧跟一个冒号

  • 函数式编程 -> 函数响应式编程 现在大家已经了解我们是如何运用函数式编程来操作序列的。其实我们可以把这种操作序列的方式再升华一下。例如,你可以把一个按钮的点击事件看作是一个序列: // 假设用户在进入页面到离开页面期间,总共点击按钮 3 次 // 按钮点击序列 let taps: Array<Void> = [(), (), ()] // 每次点击后弹出提示框 taps.forEach {

  • this 要在执行时才能确认值,定义时无法确认值 var a = { name:'A', fn:function(){ console.log(this.name); } } a.fn() //this === A a.fn.call({name:'B'}) //this === {name:'B'} var fn1 = a.fn; fn1() //this === windo

  • 本文向大家介绍Swift的函数式编程详解,包括了Swift的函数式编程详解的使用技巧和注意事项,需要的朋友参考一下 Swift 相比原先的 Objective-C 最重要的优点之一,就是对函数式编程提供了更好的支持。 Swift 提供了更多的语法和一些新特性来增强函数式编程的能力,本文就在这方面进行一些讨论。 Swift 概览 对编程语言有了一些经验的程序员,尤其是那些对多种不同类型的编程语言都有