気になる関数の実装はドキュメントの</>を押してソースコードをみてみましょう (Elixir)


はじめに

  • Elixir 楽しんでいますか
  • $\huge{今年もよろしくお願いします!!!}$
  • 今日は気になった関数のソースコードを見に行く方法をご紹介します
    • この関数、どんな実装になっているのだろう? って気になることありませんか
  • Elixirは公式ドキュメントを読むのが一番よいです

新年のごあいさつ

[12354, 12369, 12414, 12375, 12390, 12362, 12417, 12391, 12392, 12358, 12372, 12374, 12356, 12414, 12377, 127885]

$ iex

iex> (
[12354, 12369, 12414, 12375, 12390, 12362, 12417, 12391, 12392, 12358, 12372, 12374, 12356, 12414, 12377, 127885]
|> List.to_string()
)
"?????"

Elixirをインストールして、IEx(Elixir's interactive shell)を起動してお確かめください。
Elixirのインストールは、手前味噌ですが、インストールなどをご参照ください。

List.foldl/3

Elixirの公式ドキュメントをながめる旅1をしておりましたところ、List.foldl/3なる関数に行き当たりました。

Examples だけ書き起こします

iex> List.foldl([5, 5], 10, fn x, acc -> x + acc end)
20

iex> List.foldl([1, 2, 3, 4], 0, fn x, acc -> x - acc end)
2
  • Enum.reduce/3となにが違うのだろう? という疑問を持ちました
  • Elixirの実装がどうなっているかを見に行きましょう
  • 関数の右のほうにある</> がリンクになっておりまして押せますですよ!
  • ありがとナイス

https://github.com/elixir-lang/elixir/blob/v1.11.2/lib/elixir/lib/list.ex#L237-L240

defmodule List do
  ...

  @spec foldl([elem], acc, (elem, acc -> acc)) :: acc when elem: var, acc: var
  def foldl(list, acc, fun) when is_list(list) and is_function(fun) do
    :lists.foldl(fun, acc, list)
  end

https://github.com/elixir-lang/elixir/blob/v1.11.2/lib/elixir/lib/enum.ex#L2179-L2182

defmodule Enum do
  ...

  @spec reduce(t, any, (element, acc -> acc)) :: acc
  def reduce(enumerable, acc, fun) when is_list(enumerable) do
    :lists.foldl(fun, acc, enumerable)
  end

List.foldl/3Enum.reduce/3ともにErlangのlists:foldlを呼び出しています。
これにより実行結果は同じになることがわかりました

Wrapping Up

  • 気になる関数の実装は、ドキュメントの</>を押してみましょう
  • $\huge{今年もよろしくお願いします!!!}$
  • Enjoy Elixir

  1. 旅と言う名の記事を書くためのネタ探しジャーニーです。