只有当fa()成功时,最常用的方法是调用fb()

Sou*_*oup 4 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
Run Code Online (Sandbox Code Playgroud)

Gaz*_*ler 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
Run Code Online (Sandbox Code Playgroud)