『Excelから関数型言語マスター1回目:データの”並べ替え”と”絞り込み”』...をやってみた

元記事様 : https://qiita.com/piacerex/items/6714e1440e3f25fb46a1

Enum.sort() 

リスト内の要素の並べ変え(昇順)

iex> Enum.sort([5,120,41,57,97,11])
[5, 11, 41, 57, 97, 120

パイプライン演算子使うと↓

iex> [5,120,41,57,97,11] |> Enum.sort
[5, 11, 41, 57, 97, 120]

処理順が単純明快!これは楽しいぞ〜〜!

Enum.filter()

リスト内の要素の1つ1つの値を変数として  -> の後ろの処理に渡す

iex> [5, 11, 41, 57, 97, 120] |> Enum.filter(fn(n) -> n != 999 end)
[5, 11, 41, 57, 97, 120]

Enum.filter() もうちょい長めに書いてみる

|| 論理和, && 論理積, >= <= 以上以下(不等号を先に書く), == 一致, != 不一致

iex> [230, 365, 2003, 11, 459] |> Enum.filter(fn(n) -> n <= 323 || n >= 999 end)
[230, 2003, 11]

Enum.filter() 文字と数字の混在したリスト

iex(14)> [1, "two", 3, :four] |> Enum.filter(fn(n) -> n >= 2 end)
["two", 3, :four]


おお〜〜すごい!ちゃんと要素を数字と認識してくれてる!

【解決しました】なんだこれ?

iex>  [5, 11, 41, 57, 97, 120] |> Enum.filter(fn(n) -> n >= 50 end)
'9ax'

'9ax' ってなんだろう?なんか入れ間違った?

どうやら、「整数リスト内の全要素が 10進数ASCIIコードのエスケープシーケンスや印字可能文字の範囲内にあると、最終的に文字リスト(charlist)として出力される」そうだ。

IO .inspectで途中の処理を覗いてみる↓

iex>  [5, 11, 41, 57, 97, 120]|> Enum.filter(fn(n) -> n >= 50 end)|> IO .inspect(charlists: :as_lists)
[57, 97, 120]
'9ax'

1段目の出力結果(IO .inspectの出力結果)は確かにintegerである。

これが全て10進数ASCIIコードのエスケープシーケンスや印字可能文字の範囲内にあったため、パイプ全体の最終的な出力結果はASCIIコードのコードポイントの指す '9ax' となったことがわかった

参考(ASCIIコード): http://www12.plala.or.jp/mz80k2/electronics/ascii/ascii.html

参考: https://qiita.com/im_miolab/items/2d41b10ff005b334295d, https://qiita.com/Tsuyoshi84/items/0782c4a288cdb5d55f6a



この記事が気に入ったらサポートをしてみませんか?