[Elixir][Erlang]listと、filterの使い心地

ErlangもElixirも、 filter を使う操作で簡単に特定の条件に合致した要素だけのリストを作ることができます。ただ、 filter を使わないで簡単に同様な処理を表現する方法が、Erlangだけでしか思いつかなかったです。。

ただ、ここでElixirにおける for を良い感じで使いたい問題があったのでそちらも。

generate List with for syntax

と書いている箇所です。
2つ以上のリストの組み合わせを入力とした処理を書きたい時、書きやすい形で処理を表現できますね。

How to generate list with filter or other ways.

Erlang

> [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]

Elixir

> (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]

Elixir

generate List with for syntax

  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

the result

[{{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, ...}, "_"}, {{...}, ...}, {...}, ...]

適材適所。

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.