Powered by AppSignal & Oban Pro

2021-11-22 Elixir Team Weekly Recap

articles/2021-11-22_recap.livemd

2021-11-22 Elixir Team Weekly Recap

setup

Mix.install(
  [
    {:algae, "~> 1.3", override: true, app: false},
    {:quark, "~> 2.3", override: true, app: false},
    {:type_class, "~> 1.2", override: true, app: false},
    {:exceptional, "~> 2.1", override: true, app: false},
    {:operator, "~> 0.2", override: true, app: false},
    {:witchcraft, git: "https://github.com/jechol/witchcraft.git", override: true, app: false}
  ]
  # force: true
)
use Witchcraft
alias Algae.Either.Right
alias Algae.Either.Left

chain do ➡️ monad %Right

chain 과 monad 는 거의 같은 기능을 한다. 다만 monad 의 경우 return 을 사용하면, return 의 값을 monad 에 명시된 타입에 넣어준다.

chain do
  Right.new(10)
  Right.new(20)
  val <- Right.new(30)
  val
end
monad [] do
  Right.new(10)
  Right.new(20)
  val <- Right.new(30)
  val
end
monad %Right{} do
  Right.new(10)
  Right.new(20)
  val <- Right.new(30)
  return(val)
end

체이닝 중간에 %Left{} 가 있으면, %Left{} 가 그대로 리턴된다.

monad %Right{} do
  Right.new(10)
  Left.new(20)
  val <- Right.new(30)
  return(val)
end

traverse

traverse_async 가 디폴트가 되었다.

reader.run

reader 를 활용하는 케이스를 잊어버린 것 같다. 다시 연습해보자

defmodule Hello do
  use Witchcraft
  import Algae.Reader

  def world do
    monad %Algae.Reader{} do
      env <- ask()
      let(val = Map.get(env, :val, false))
      return(val)
    end
  end
end
Hello.world()
|> Algae.Reader.run(%{val: true})

Weird chain macro

왜 인지는 모르겠지만, livebook 에서 chain 매크로를 1번 이상 사용할 수 없다. 2번째 부터는 정의가 되어있지 않다는 이상한 에러 메시지가 출력되며, 다시 사용하기 위해서는 use Witchcraft 를 한번더 실행해야 하거나, Witchcraft.Chain.chain 같은 완전한 형태로 써줘야 한다.

chain do
  Right.new(10)
end
Witchcraft.Chain.chain do
  Right.new(10)
end

흠 그런데, 새로운 노트북을 만들어서 witchcraft 의존성만 설치했더니, 문제없이 chain 매크로를 계속 사용할 수 있었다. algae 의 문제인 것일까?

Mix.install(
  [
    {:witchcraft, git: "https://github.com/witchcrafters/witchcraft.git", override: true},
  ],
  force: true
)

아앗, 의존성을 아래와 같이 설치했더니 잘 동작한다. 이 노트북의 의존성은 잘못 설치된 것 😅 force 옵션을 제거하면, 캐시를 활용할 수 있다.

Mix.install(
  [
    {:witchcraft, git: "https://github.com/witchcrafters/witchcraft.git", override: true},
    {:algae, "~> 1.3"}
  ],
  force: true
)