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)
解决此问题的常用方法(没有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)