ruby - 从函数式编程的角度来看,Ruby 在过滤后返回不同的类型是否异常?

标签 ruby functional-programming

在 Ruby 中,有一些过滤器函数会生成与您开始时不同的类型。

例如,如果你这样做

{a: 2, b: 0}.find_all{|key, value| value.zero?}
# Use Hash[new_array] to turn it into a hash

你最终得到一个键和值的数组,而不是另一个散列。

如果你这样做

str = "happydays"
all_indexes = [1, 2, 7, 8]
str.each_char.reject.with_index{|char, index| all_indexes.include?(index)}
# Use .join to turn it into a string

你最终得到的是一个字符数组,而不是一个字符串。

从函数式编程的角度来看这是正常的,还是仅仅表明 Ruby 没有完美地实现函数式编程范式?

最佳答案

哪种语言“完美地实现了函数式编程范式”? Haskell、Erlang、Pure、OCaml、Clojure?选择你的选择,他们都倾向于以完全不同的方式做事。我真的不想在这里争论(我经营一个函数式编程用户组,我们喜欢在其中讨论此类内容),但与 OOP 一样,对于函数式编程的含义有不同的想法。

虽然大多数人不会争辩说 Haskell 在纯度方面处于领先地位,但它绝不是实现 FP 的唯一方法。恕我直言,Michael Fogus 和 Chris Houser 在“The Joy of Clojure”中对此做了很好的总结:

Functional programming concerns and facilitates the application and composition of functions. Further, for a language to be considered functional, its notion of function must be first-class. The functions of a language must be able to be stored, passed, and returned just like any other piece of data within that language. It’s beyond this core concept that the definitions branch toward infinity, but thankfully, it’s enough to start.

函数实际上只不过是从域到辅域的某种映射,而且两者肯定不必相同。如果您查看像 f(x) = sqrt(x) 这样的函数并假设 N(自然数)是 f 的定义域,很明显codomain 将不相同(除非您想要一个在大范围内未定义的函数)。

综上所述,我不认为这种行为有什么特别的问题。对齐类型(尽管我们不常在 Ruby 中使用这个术语)是开发人员的责任,而不是语言。后者可以帮助找到那些不匹配的地方,并且在找到它们的时间上也有所不同(例如,编译时间与运行时间)。

正如 Mladen 所说,有很多因素阻止 Ruby 成为一种纯函数式语言,但对于大多数语言来说都是如此,其中相当一部分本身就是函数式语言(例如,Clojure 通常更倾向于可用性和实用主义而不是纯粹性)。然而,如果真的想要并注意一些细节,则很有可能在 Ruby 中以非常函数式的风格进行编程。以下是有关该主题的一些链接:

关于ruby - 从函数式编程的角度来看,Ruby 在过滤后返回不同的类型是否异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5738065/

相关文章:

haskell - 在多个属性上编写有序比较的优雅方式

ruby - Bundler 找不到出现在网站上的 Ruby gem

mysql - 如何重新创建问题:Mysql2::Error:非法混合排序规则(latin1_swedish_ci,IMPLICIT)

ruby - Lisp 和 Erlang 原子、Ruby 和 Scheme 符号。它们有多有用?

mysql - Rails 没有使用 database.yml 中提供的密码

haskell - 如何基于 if/then/else 语句定义变量

functional-programming - Clojure 与哪些函数式语言最相似?

c# - 转换 Func<> 类型

Python:在功能上合并两个迭代器,其中一个迭代器是递归的

ruby - 使用Ruby通过SSH发送脚本