Tag: 函数式编程

从function编程的角度来看,Rubyfilter是不同类型的?

在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没有完美地实现函数式编程范式?

Ruby Reverse Currying:这可能吗?

关于Ruby 1.9.x中的currying,我一直在某些地方使用它,并且可以像基本上支持默认参数一样转换为proc参数: p = proc {|x, y, z|x + y + z} p.curry[1] #=> returns a lambda p.curry[1, 2] #=> returns a lambda p.curry[1, 2, 3] #=> 6 p2 = p.curry[1, 2] p2.(2) #=> 5 p2.(4) #=> 7 非常方便,对吗? 事情是,我希望能够反向curry,这意味着,用随机值填充我的proc的最后一个参数。 像这样: p = proc{|x, y| x – y }.curry[1] p.(4) 我想要的结果是3.这会返回-3。

是否可以在没有函数的语言中进行函数式编程?

在这篇评论中 ,有人说Ruby没有函数,只有方法。 如果Ruby没有函数,是不是可以在其中进行函数式编程? 或者我对术语“function”感到困惑? 我的意思是“函数式编程”在函数意义上作为第一类对象,而不是在禁止可变状态。

Erlang actor与OOP对象有何不同?

假设我有一个像这样定义的Erlang actor: counter(Num) -> receive {From, increment} -> From ! {self(), new_value, Num + 1} counter(Num + 1); end. 同样,我有一个像这样定义的Ruby类: class Counter def initialize(num) @num = num end def increment @num += 1 end end Erlang代码以函数式编写,使用尾递归来维护状态。 但是,这种差异的有意义的影响是什么? 对于我天真的眼睛,这两个东西的接口看起来大致相同:你发送一条消息,状态得到更新,你得到了新状态的表示。 函数式编程经常被描述为与OOP完全不同的范例。 但是Erlang actor似乎完全按照对象应该做的:维护状态,封装并提供基于消息的接口。 换句话说,当我在Erlang actor之间传递消息时,它与我在Ruby对象之间传递消息的方式有何不同? 我怀疑function/ OOP二分法的影响比我看到的要大。 有谁可以指出他们? 让我们撇开这样一个事实,即Erlang actor将由VM调度,因此可以与其他代码同时运行。 我意识到这是Erlang和Ruby版本之间的一个主要区别,但这不是我所得到的。 在其他语言中可以实现并发,包括Ruby。 虽然Erlang的并发性可能表现得非常不同(有时甚至更好),但我并不是真的在询问性能差异。 相反,我对问题的function与OOP方面更感兴趣。

使用关键字参数来描述proc

假设我有一个通用的Proc , Lambda或带有可选第二个参数的方法: pow = -> (base, exp: 2) { base**exp } 现在我想讨论这个函数,给它一个3的exp 。 cube = pow.curry.call(exp: 3) 这里存在歧义,源于关键字参数和新的哈希语法,其中Ruby将exp: 3解释为作为第一个参数base传递的哈希。 这导致函数立即被调用,当#**被发送到散列时呈现NoMethodError 。 为第一个参数设置默认值同样会导致在currying时立即调用该函数,并且如果我根据需要标记第一个参数,而不提供默认值: pow = -> (base:, exp: 2) { base**exp } 当我试图讨论Proc时,翻译会抱怨我缺少参数base 。 如何用第二个参数来讨论函数?

如何将整数数组汇总为范围数组?

我想接受以下输入: [1,2,4,5,6,7,9,13] 把它变成如下的东西: [[1,2],[4,7],[9,9],[13,13]] 每个子数组代表一个整数范围。

Proc和Lambda之间的差异

Ruby在Proc.new和lambda (或1.9中的->()运算符)创建的Proc.new之间存在差异。 似乎非lambda Procs将splat一个传递给块参数的数组; 通过lambda创建的过程不会。 p = Proc.new { |a,b| a + b} p[[1,2]] # => 3 l = lambda { |a,b| a + b } l[[1,2]] # => ArgumentError: wrong number of arguments (1 for 2) 有没有人对这种行为背后的动机有任何见解?

ruby中的function代码示例

我正在寻找ruby中的function代码示例。 也许你知道一些gem,在哪里可以找到这样的代码?