Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Functional programming 只有在fa()成功时才调用fb()的最惯用方法_Functional Programming_Elixir - Fatal编程技术网

Functional programming 只有在fa()成功时才调用fb()的最惯用方法

Functional programming 只有在fa()成功时才调用fb()的最惯用方法,functional-programming,elixir,Functional Programming,Elixir,我有两个函数,我想运行步骤1,然后只在步骤1正常时运行步骤2。构造此代码的功能上最惯用的方法是什么?嵌套案例语句看起来很难看,但我不知道除了if之外还有什么其他方法可以做到,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 c

我有两个函数,我想运行步骤1,然后只在步骤1正常时运行步骤2。构造此代码的功能上最惯用的方法是什么?嵌套案例语句看起来很难看,但我不知道除了if之外还有什么其他方法可以做到,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

在没有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,因为在这种特殊情况下,它是迄今为止最难阅读和理解的。