【问题标题】:Most idiomatic way to call fb() only if fa() succeeds仅当 fa() 成功时才调用 fb() 的最惯用方式
【发布时间】:2015-10-19 15:37:52
【问题描述】:

我有两个函数,我想运行step_1,然后只在step_1 没问题的情况下运行step_2。构造此代码的最实用的惯用方式是什么?嵌套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

【问题讨论】:

标签: functional-programming elixir


【解决方案1】:

解决这个问题的一种常用方法(没有 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

【讨论】:

  • 是的,@gazler 的解决方案或您的解决方案使用案例是最好的。应该避免使用“if”,因为在这种特殊情况下,它是迄今为止最难阅读和理解的。
猜你喜欢
  • 2014-08-14
  • 2014-05-04
  • 2019-07-25
  • 2015-05-24
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
相关资源
最近更新 更多