<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>パターンマッチ on 黒曜の吹き溜まり</title>
    <link>https://blog.kokuyouwind.com/tags/%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%83%9E%E3%83%83%E3%83%81/</link>
    <description>Recent content in パターンマッチ on 黒曜の吹き溜まり</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>ja</language>
    <lastBuildDate>Fri, 29 Nov 2019 12:44:45 +0900</lastBuildDate>
    
	<atom:link href="https://blog.kokuyouwind.com/tags/%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%83%9E%E3%83%83%E3%83%81/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>Rubyパターンマッチを闇の力でアクティブにする</title>
      <link>https://blog.kokuyouwind.com/posts/2019/11/ruby%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%83%9E%E3%83%83%E3%83%81%E3%82%92%E9%97%87%E3%81%AE%E5%8A%9B%E3%81%A7%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%81%AB%E3%81%99%E3%82%8B/</link>
      <pubDate>Fri, 29 Nov 2019 12:44:45 +0900</pubDate>
      
      <guid>https://blog.kokuyouwind.com/posts/2019/11/ruby%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%83%9E%E3%83%83%E3%83%81%E3%82%92%E9%97%87%E3%81%AE%E5%8A%9B%E3%81%A7%E3%82%A2%E3%82%AF%E3%83%86%E3%82%A3%E3%83%96%E3%81%AB%E3%81%99%E3%82%8B/</guid>
      <description>&lt;p&gt;この記事は&lt;a href=&#34;https://qiita.com/advent-calendar/2019/misoca-yayoi&#34; target=&#34;_blank&#34;&gt;Misoca+弥生 Advent Calendar 2019&lt;/a&gt;の1日目です。&lt;/p&gt;

&lt;p&gt;もう12月ですよ、12月！&lt;/p&gt;

&lt;p&gt;記事の内容とはなんの関係もありませんが、デレステに&lt;a href=&#34;https://www.youtube.com/watch?v=DEjJ9ZyVyhM&#34; target=&#34;_blank&#34;&gt;M@GIC&lt;/a&gt;が実装されましたね。&lt;/p&gt;

&lt;p&gt;&lt;img src=&#34;https://img.esa.io/uploads/production/attachments/11821/2019/11/29/38032/6c49fab4-c96f-4d4a-aa57-9eaf5fe022ca.jpg&#34; alt=&#34;Screenshot_20191128-222733.jpg (175.9 kB)&#34; /&gt;&lt;/p&gt;

&lt;p&gt;アニメを思い起こさせる最高のMVでした……&lt;/p&gt;

&lt;h3 id=&#34;rubyのパターンマッチ&#34;&gt;💎  Rubyのパターンマッチ&lt;/h3&gt;

&lt;p&gt;Ruby 2.7で、ついにパターンマッチが導入されますね。&lt;/p&gt;

&lt;p&gt;今は&lt;a href=&#34;https://www.ruby-lang.org/ja/news/2019/11/23/ruby-2-7-0-preview3-released/&#34; target=&#34;_blank&#34;&gt;Ruby 2.7.0-preview3&lt;/a&gt;で試すことができます。正式にリリースされるのは、おそらく例年通り12月25日でしょうか。&lt;/p&gt;

&lt;p&gt;パターンマッチ機能の使い方をざっくり書くと、&lt;code&gt;case ... in ...&lt;/code&gt;のような形でパターンマッチを行える機能です。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-ruby&#34;&gt;case { key: :value}
in { key: x }
  p x # =&amp;gt; :value
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;詳しい話は&lt;a href=&#34;https://speakerdeck.com/k_tsj/pattern-matching-new-feature-in-ruby-2-dot-7&#34; target=&#34;_blank&#34;&gt;RubyKaigiでの発表スライド&lt;/a&gt;のほか、&lt;a href=&#34;https://tech.medpeer.co.jp/entry/2019/05/13/090000&#34; target=&#34;_blank&#34;&gt;メドピアさんの「Ruby2.7の(実験的)新機能「パターンマッチ」で遊ぶ」&lt;/a&gt;がよくまとまっておりわかりやすいです。&lt;/p&gt;

&lt;h3 id=&#34;f-のアクティブパターン&#34;&gt;🐫  F#のアクティブパターン&lt;/h3&gt;

&lt;p&gt;ところで、F#では&lt;a href=&#34;https://docs.microsoft.com/ja-jp/dotnet/fsharp/language-reference/active-patterns&#34; target=&#34;_blank&#34;&gt;アクティブパターン&lt;/a&gt;という機能を使うことができます。&lt;/p&gt;

&lt;p&gt;これは、パターンへの分解を、マッチ対象とは別に定義できるものです。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-fsharp&#34;&gt;let (|Even|Odd|) input = if input % 2 = 0 then Even else Odd

let TestNumber input =
   match input with
   | Even -&amp;gt; printfn &amp;quot;%d is even&amp;quot; input
   | Odd  -&amp;gt; printfn &amp;quot;%d is odd&amp;quot; input

TestNumber 11 (* 11 is odd *)
TestNumber 32 (* 32 is even *)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;上記のように、マッチ対象となる数値とは独立して&lt;code&gt;Even&lt;/code&gt;と&lt;code&gt;Odd&lt;/code&gt;というパターンを定義することができます。&lt;/p&gt;

&lt;p&gt;さらに、パターンへの分解方法を変えることも可能です。&lt;/p&gt;

&lt;pre&gt;&lt;code class=&#34;language-fsharp&#34;&gt;let (|RGB|) (col : System.Drawing.Color) =
     ( col.R, col.G, col.B )

let (|HSB|) (col : System.Drawing.Color) =
   ( col.GetHue(), col.GetSaturation(), col.GetBrightness() )

let printRGB (col: System.Drawing.Color) =
   match col with
   | RGB(r, g, b) -&amp;gt; printfn &amp;quot; Red: %d Green: %d Blue: %d&amp;quot; r g b

let printHSB (col: System.Drawing.Color) =
   match col with
   | HSB(h, s, b) -&amp;gt; printfn &amp;quot; Hue: %f Saturation: %f Brightness: %f&amp;quot; h s b
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;上記のように、&lt;code&gt;Color&lt;/code&gt;型に対してRGB値で取り出したりHSB値で取り出したりすることができます。&lt;/p&gt;

&lt;p&gt;Rubyのパターンマッチでは、パターンへの分解はマッチ対象の&lt;code&gt;deconstruct&lt;/code&gt;や&lt;code&gt;deconstruct_keys&lt;/code&gt;を使うため、分解方法を切り替えるには&lt;a href=&#34;https://docs.ruby-lang.org/ja/latest/method/Module/i/refine.html&#34; target=&#34;_blank&#34;&gt;Refinement&lt;/a&gt;を使うのが現実的な落とし所です。&lt;/p&gt;

&lt;p&gt;&lt;blockquote class=&#34;twitter-tweet&#34;&gt;&lt;p lang=&#34;ja&#34; dir=&#34;ltr&#34;&gt;一般的な回答としてはRefinements使ってくださいですかね。その場合RGBかHSVかの使い分けはRefinementsのスコープが最小範囲になりますが。&lt;/p&gt;&amp;mdash; k_tsj (@k_tsj) &lt;a href=&#34;https://twitter.com/k_tsj/status/1196673164622860288?ref_src=twsrc%5Etfw&#34;&gt;November 19, 2019&lt;/a&gt;&lt;/blockquote&gt; &lt;script async src=&#34;https://platform.twitter.com/widgets.js&#34; charset=&#34;utf-8&#34;&gt;&lt;/script&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;deconstruct&lt;/code&gt;などをパターン側ではなくマッチ対象側に持たせた理由は、辻本さんが&lt;a href=&#34;https://www.lambdanote.com/collections/n/products/nmonthly-vol-1-no-3-2019&#34; target=&#34;_blank&#34;&gt;n月刊ラムダノート Vol.1, No.3&lt;/a&gt;に書かれていました。設計判断の話や他言語との比較もいろいろ言及されていて興味深かったです。&lt;/p&gt;

&lt;p&gt;……が、それでもF#っぽい書き方をしたい！ と思ったのでそれっぽい実装を考えてみよう、というのが今回のテーマです。&lt;/p&gt;

&lt;p&gt;ちなみに「闇の力」とタイトルに入っていますが、実装してみたらTracePointとかISeqとかを使わない形に落ち着いたので若干釣りタイトルになっています。&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>