ErlangもElixirも、 filter を使う操作で簡単に特定の条件に合致した要素だけのリストを作ることができます。ただ、 filter を使わないで簡単に同様な処理を表現する方法が、Erlangだけでしか思いつかなかったです。。
ただ、ここでElixirにおける for を良い感じで使いたい問題があったのでそちらも。
generate List with for syntax
と書いている箇所です。
2つ以上のリストの組み合わせを入力とした処理を書きたい時、書きやすい形で処理を表現できますね。
How to generate list with filter or other ways.
> [X || X <- lists:seq(1, 5), X rem 3 == 0].
[3]
> lists:filter(fun(X) -> X rem 3 == 0 end, lists:seq(1, 5)).
[3]
> (for x <- 1..5, do: if rem(x, 3) == 0, do: x) |> Enum.filter(&(&1 != nil))
[3]
> 1..5 |> Enum.filter(&(rem(&1, 3) == 0))
[3]
defstruct black: {7, 3}, white: {0, 3}
def to_string(queens) do
white = queens.white
black = queens.black
for x <- 0..7,
y <- 0..7 do
case {x, y} do
^white -> {{x, y}, "W"}
^black -> {{x, y}, "B"}
{_, _} -> {{x, y}, "_"}
end
end
end
[{{0, 0}, "_"}, {{0, 1}, "_"}, {{0, 2}, "_"}, {{0, 3}, "_"}, {{0, 4}, "_"},
{{0, 5}, "_"}, {{0, 6}, "_"}, {{0, 7}, "_"}, {{1, 0}, "_"}, {{1, 1}, "_"},
{{1, 2}, "_"}, {{1, 3}, "_"}, {{1, 4}, "_"}, {{1, 5}, "_"}, {{1, 6}, "_"},
{{1, 7}, "_"}, {{2, 0}, "_"}, {{2, 1}, "_"}, {{2, 2}, "_"}, {{2, 3}, "_"},
{{2, 4}, "W"}, {{2, 5}, "_"}, {{2, 6}, "_"}, {{2, 7}, "_"}, {{3, 0}, "_"},
{{3, 1}, "_"}, {{3, 2}, "_"}, {{3, 3}, "_"}, {{3, 4}, "_"}, {{3, 5}, "_"},
{{3, 6}, "_"}, {{3, 7}, "_"}, {{4, 0}, "_"}, {{4, 1}, "_"}, {{4, 2}, "_"},
{{4, 3}, "_"}, {{4, 4}, "_"}, {{4, 5}, "_"}, {{4, 6}, "_"}, {{4, 7}, "_"},
{{5, 0}, "_"}, {{5, 1}, "_"}, {{5, 2}, "_"}, {{5, 3}, "_"}, {{5, 4}, "_"},
{{5, 5}, "_"}, {{5, 6}, "_"}, {{5, ...}, "_"}, {{...}, ...}, {...}, ...]
適材適所。