Elixir中的等式运算符是否有前缀/波兰表示法?

时间:2016-05-06 04:17:21

标签: elixir pointfree

我正在学习Elixir,我决定给自己做的一个练习是尝试在惯用的Elixir中写Luhn algorithm进行信用卡验证。

我意识到Elixir中的==是一个内核函数,显然是由编译器内联的。是否有某种实用功能可以让我做这样的事情?

...
|> == 0

而不是必须定义一个管道输入的功能,正如我在这里所做的那样。

药剂

defmodule Luhn do
  def equalzero?(x) x == 0 end
  def validate(num) do
    digits = Integer.digits(num)
    len = length digits

    digits
    |> Stream.with_index
    |> Enum.reverse
    |> Enum.reduce(0, fn {digit, index}, acc ->
      if rem(len - index, 2) == 0 do
        acc + digit * 2 |> Integer.digits |> Enum.sum
      else
        acc + digit
      end
    end)
    |> rem(10)
    |> Luhn.equalzero?
  end
end

1 个答案:

答案 0 :(得分:4)

您可以通过引用它们的完整路径Kernel来管道输入这些运算符(在Kernel.==中定义):

iex(1)> 0 |> Kernel.==(0)
true
iex(2)> 1 |> Kernel.==(0)
false