仅当fa()成功

时间:2015-10-19 07:34:50

标签: functional-programming elixir

我有两个功能,我想运行step_1,然后仅在step_2正常时运行step_1。什么是构建此代码的最功能惯用方式?嵌套case语句看起来很难看但我不确定除了if之外还有什么其他方法可以做到这一点甚至更糟。

defmodule Test do
  def step_1 do
    IO.puts "Step 1"
    :error
  end

  def step_2 do
    IO.puts "Step 2"
    :ok
  end

  def do_something_case do
    case step_1 do
      :ok ->
        case step_2 do
          :ok -> {:ok}
          :error -> {:error, :step_2}
        end
      :error -> {:error, :step_1}
    end
  end

  def do_something_if do
    r1 = step_1
    if r1 == :ok
      r2 = step_2
      if r2 == :ok
        :ok
      else
        {:error, :step_2}
      end
    else
      {:error, :step_1}
    end
  end
end

1 个答案:

答案 0 :(得分:8)

解决此问题的常用方法(没有monad库)是对函数的参数进行模式匹配并将它们组合在一起。

defmodule Test do
  def step_1 do
    IO.puts "Step 1"
    :error
  end

  def step_2(:ok) do
    IO.puts "Step 2"
    :ok
  end
  def step_2({:error, _reason} = error) do
    error
  end

  def do_something_pipeline do
    step_1
    |> step_2
  end
end