3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

すごいHaskellたのしく学ぼう! を学びなおしてみる(第2章、第3章)[with Elixir]

Last updated at Posted at 2020-04-11

はじめに

  • 前回
  • 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 を参考にしました

まとめ

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?