はじめに
- 前回
- Elixirを使いはじめてだいたい1年くらいがたちました
- すごいHaskellたのしく学ぼう!という本を2015年に買って、一通り読んだあとずっと本棚にしまわれていたままでした
- 久しぶりに引っ張り出して読んでみると、こんなに愉快な内容だったけ!? という感想を持ちました
- Elixirで関数プログラミングにだいぶ慣れたので、ユーモアの部分を楽しむ余裕ができたのだとおもいます
- 少しずつ読み進めながら、興味が向いたところだけElixirで書き換えてみたりして理解を深めていきたいとおもいます
リストのパターンマッチとリスト内包表記
- タプルの2番目の要素が
3
のものだけに絞りこんで、1番目の要素を100倍して3を足したリストをつくります
Haskell
Prelude> let xs = [(1,3),(4,3),(2,4),(5,3),(5,6),(3,1)]
Prelude> [x*100+3 | (x,3) <- xs]
[103,403,503]
Elixir
iex> for {x,3} <- [{1,3},{4,3},{2,4},{5,3},{5,6},{3,1}], do: x * 100 + 3
[103, 403, 503]
- Elixirでも同じような感じです
asパターン
- firstLetterという関数は文字列をうけとって、
"The first letter of #{文字列} is #{先頭文字}"
を返します
Haskell
Prelude> firstLetter "" = "Empty string, whoops!"
Prelude> firstLetter all@(x:xs) = "The first letter of " ++ all ++ " is " ++ [x]
Prelude> firstLetter "Dracula"
"The first letter of Dracula is D"
- 全体の文字列にもアクセスしたい場合に、Haskellでは
asパターン
というものを使うそうです
Elixir
- Elixirでも同じことをやってみましょう
awesome.exs
defmodule Awesome do
def first_letter(<<>>) do
"Empty string, whoops!"
end
def first_letter(<<x::8, _rest::binary>> = all) do
"The first letter of " <> all <> " is " <> List.to_string([x])
end
end
iex> c "awesome.exs"
iex> Awesome.first_letter("Dracula")
"The first letter of Dracula is D"
-
Elixirの場合は、パターンマッチさせつつ、その全体も欲しいときには、
<<x::8, _rest::binary>> = all
のように書きます- 文字列のパターンマッチってどうやるのかこの記事を書いている瞬間は知らなかったのですが、きっとできるのだろうとおもってStringのドキュメントを眺めていたら、String and binary operations の内容でなんとなく理解しました
-
x
は整数で得られたのでそれを文字列に戻す処理は、[Elixir/OTP 20] Covert ascii/number to string を参考にしました
まとめ
- すごいHaskellたのしく学ぼう!
- 題名の通り、楽しく学べています。