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
)