<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>【パターンマッチ】タグの記事一覧｜Haskell Tech</title>
	<atom:link href="https://haskell-tech.nkhn37.net/tag/%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%83%9E%E3%83%83%E3%83%81/feed/" rel="self" type="application/rss+xml" />
	<link>https://haskell-tech.nkhn37.net</link>
	<description>Haskell学習サイト</description>
	<lastBuildDate>Thu, 18 Jan 2024 21:56:27 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.4</generator>

<image>
	<url>https://haskell-tech.nkhn37.net/wp-content/uploads/2023/12/cropped-lion-normal-clear-32x32.png</url>
	<title>【パターンマッチ】タグの記事一覧｜Haskell Tech</title>
	<link>https://haskell-tech.nkhn37.net</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【Haskell】関数におけるパターンマッチ</title>
		<link>https://haskell-tech.nkhn37.net/haskell-function-pattern-match/</link>
					<comments>https://haskell-tech.nkhn37.net/haskell-function-pattern-match/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Wed, 17 Jan 2024 20:00:00 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<category><![CDATA[パターンマッチ]]></category>
		<guid isPermaLink="false">https://haskell-tech.nkhn37.net/?p=255</guid>

					<description><![CDATA[Haskellの関数実装において非常に重要なパターンマッチの使い方の基本について解説します。 関数におけるパターンマッチ Haskellは、純粋関数型プログラミング言語のひとつです。Haskellでのプログラミングでは関]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Haskellの関数実装において非常に重要な<span class="marker"><strong>パターンマッチ</strong></span>の使い方の基本について解説します。</p>



<h2 class="wp-block-heading">関数におけるパターンマッチ</h2>



<p class="wp-block-paragraph">Haskellは、純粋関数型プログラミング言語のひとつです。Haskellでのプログラミングでは関数が中心となります。Haskellの関数の基本については「<a href="https://haskell-tech.nkhn37.net/haskell-function-basic/" target="_blank" rel="noreferrer noopener">関数の基本</a>」でまとめていますので参考にしてください。</p>



<p class="wp-block-paragraph">Haskellの関数の実装において重要となる機能が「<span class="marker"><strong>パターンマッチ</strong></span>」です。パターンマッチは、異なる引数の形に基づいて異なる定義を行うことができる非常に強力な機能です。基本的な考え方としては、関数が受け取る引数の値の形状に基づいて処理を分岐させることにあります。</p>



<p class="wp-block-paragraph">パターンマッチにはいくつかの代表的なパターンがあり、それらを組み合わせて使うことで非常に幅広い問題に対処することが可能になります。そのため、代表的なパターンを把握しておくことは非常に有益です。</p>



<p class="wp-block-paragraph">本記事では、関数における代表的なパターンマッチの種類について例を使いながら紹介することで、Haskellのパターンマッチの基本を紹介します。</p>



<h3 class="wp-block-heading">リテラルパターン</h3>



<p class="wp-block-paragraph">最も基本的なパターンは、<span class="marker"><strong>リテラルパターン</strong></span>といいます。リテラルパターンでは、以下例のようにリテラル（数値、文字列、論理値等）の一致でマッチングを行います。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: haskell; title: ; notranslate">
isZeroOrOne :: (Eq a, Num a) =&gt; a -&gt; Bool
isZeroOrOne 0 = True
isZeroOrOne 1 = True
isZeroOrOne _ = False
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
【関数使用結果例】
ghci&gt; isZeroOrOne 0
True
ghci&gt; isZeroOrOne 1
True
ghci&gt; isZeroOrOne 2
False
</pre></div>


<p class="wp-block-paragraph">上記例では、<code>0</code>または<code>1</code>であれば<code>True</code>、その他の数値の場合は<code>False</code>を返却します。<code>_</code>はすべての値にマッチすることを示します。このようにHaskellでは、同じ関数に対して複数の定義を列挙していく記載方法をします。この記載方法のことをパターンマッチといいます。</p>



<p class="wp-block-paragraph">なお、「<code>isZeroOrOne :: (Eq a, Num a) => a -> Bool</code>」の部分は型シグネチャという関数の引数や返却値の型を示す宣言で、この例では<code>Int</code>等の数値型を引数に取り、<code>Bool</code>型を返却するという意味です。今後の関数でも型シグネチャの記載が出てきますが、型シグネチャが本記事の主題ではないので詳細の説明は省略します。</p>



<h3 class="wp-block-heading">変数パターン</h3>



<p class="wp-block-paragraph"><span class="marker"><strong>変数パターン</strong></span>は、受け取った引数の値を変数に設定して処理をするようなパターンです。以下の例における<code>x</code>のパターンが該当します。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: haskell; title: ; notranslate">
sayNo :: (Eq a, Num a, Show a) =&gt; a -&gt; String
sayNo 1 = &quot;One&quot;
sayNo 2 = &quot;Two&quot;
sayNo x = &quot;Not 1 or 2. &quot; ++ &quot;This is &quot; ++ show x ++ &quot;.&quot;
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
【関数使用結果例】
ghci&gt; sayNo 1
&quot;One&quot;
ghci&gt; sayNo 2
&quot;Two&quot;
ghci&gt; sayNo 3
&quot;Not 1 or 2. This is 3.&quot;
</pre></div>


<p class="wp-block-paragraph">上記例では、引数が<code>1</code>の場合は「<code>"One"</code>」、引数が<code>2</code>の場合は「<code>"Two"</code>」を表示します。そして、それ以外の数値が来た場合には、変数<code>x</code>にその値が設定され、その値を用いて「<code>"Not 1 or 2. This is x"</code>」という形式でxの部分に引数の数値が表示されます。</p>



<p class="wp-block-paragraph">このパターンでは、順番に注意する必要があります。パターンマッチは上から順に適用されるために変数パターンを先頭に持ってきてしまうと他の処理が実行されなくなってしまいます。</p>



<h3 class="wp-block-heading">ワイルドカードパターン</h3>



<p class="wp-block-paragraph">どのような値にもマッチするパターンを<span class="marker"><strong>ワイルドカードパターン</strong></span>といいます。リテラルパターンで紹介した<code>isZeroOrOne</code>関数の「<code>_</code>」がこのワイルドカードパターンの例になります。(以下再掲)</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: haskell; title: ; notranslate">
isZeroOrOne :: (Eq a, Num a) =&gt; a -&gt; Bool
isZeroOrOne 0 = True
isZeroOrOne 1 = True
isZeroOrOne _ = False
</pre></div>


<p class="wp-block-paragraph">「<code>_</code>」は任意の値にマッチして、その値を捨てるという意味なので、マッチされた値が関数の定義の中で必要ない場合に特に有用です。上記例では<code>True</code>、<code>False</code>を返却するだけですので、引数の値自体は必要ありません。引数の値が必要な場合は、変数パターンを使用する必要があります。</p>



<p class="wp-block-paragraph">また、ワイルドカードパターンはすべての引数にマッチするため、パターンマッチの順序としては一番最後に記載する必要がある点に注意が必要です。そうしない場合、他のパターンは実行されなくなってしまいます。</p>



<h3 class="wp-block-heading">リストパターン</h3>



<p class="wp-block-paragraph">リストの形状にマッチさせるようなパターンを<span class="marker"><strong>リストパターン</strong></span>といいます。代表的なものはHaskellのリストで提供されている<code>head</code>関数です。<code>head</code>関数を自分で書いてみた<code>head'</code>関数は以下のようになります。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: haskell; title: ; notranslate">
head&#039; :: &#x5B;a] -&gt; a
head&#039; (x:xs) = x
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
【関数使用結果例】
ghci&gt; head&#039; &#x5B;1, 2, 3, 4]
1
ghci&gt; head&#039; &#x5B;&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;]
&quot;a&quot;
</pre></div>


<p class="wp-block-paragraph">上記では、<code>(x:xs)</code>の部分でリストの情報にマッチします。<code>x</code>は先頭要素、<code>xs</code>は残りの部部分を表しており、この表現はHaskellではよく見かける表現です。<code>head'</code>は先頭要素を返却する関数なわけなので<code>x</code>を返却すれば関数として実現したい機能を表現できます。</p>



<p class="wp-block-paragraph">この基本的な考え方が分かれば、先頭2要素を取ってくるような関数も以下のように書くことができます。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: haskell; title: ; notranslate">
firstTwoItems :: &#x5B;b] -&gt; (b, b)
firstTwoItems (x:y:_) = (x, y)
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
【関数使用結果例】
ghci&gt; firstTwoItems &#x5B;1, 2, 3, 4]
(1,2)
ghci&gt; firstTwoItems &#x5B;&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;]
(&quot;a&quot;,&quot;b&quot;)
</pre></div>


<p class="wp-block-paragraph">上記の例では、先頭要素が<code>x</code>に2番目の要素が<code>y</code>に入りますので、それらの値を使ってタプルにして返却しています。また、残りの部分は使わないので今回はワイルドカードパターンの「<code>_</code>」を使って捨てています。</p>



<p class="wp-block-paragraph">なお、このパターンにおいて<code>()</code>を取り除いてしまうと、リストのパターンと解釈されなくなってしまうので注意が必要です。</p>



<div class="wp-block-jin-gb-block-box-with-headline kaisetsu-box5"><div class="kaisetsu-box5-title">Note</div>
<p class="wp-block-paragraph">Haskellにおいて、上記で紹介した「<code>head'</code>」のように関数名に「<code>'</code>」(アポストロフィまたはプライム記号と読みます)を使用するのは文法上で有効なものです。</p>



<p class="wp-block-paragraph">既存の関数の変更版や改良版を示すためや補助的な関数名に使われるなど意味を持って「<code>'</code>」が使われることがあります。本サイトでは既存関数を自分で実装してみるということをよくしますが、その際には既存関数名に「<code>'</code>」を付けた関数名を使います。</p>
</div>



<h3 class="wp-block-heading">タプルパターン</h3>



<p class="wp-block-paragraph">タプルの引数に対してマッチさせるパターンを<span class="marker"><strong>タプルパターン</strong></span>と言います。この例の説明でよく出てくるのが座標に関する関数です。</p>



<p class="wp-block-paragraph">以下は、2つの<code>(x, y)</code>のペアを受け取って足し算をベクトルの足し算をするような<code>addVectors</code>関数です。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: haskell; title: ; notranslate">
addVectors :: (Num a, Num b) =&gt; (a, b) -&gt; (a, b) -&gt; (a, b)
addVectors (x1, y1) (x2, y2) = (x1 + x2, y1 + y2)
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
【関数使用結果例】
ghci&gt; addVectors (1, 2) (3, 4)
(4,6)
</pre></div>


<p class="wp-block-paragraph">この例では、1つ目の引数で受け取ったタプルの要素が<code>x1</code>と<code>y1</code>に、2つ目の引数で受け取ったタプルが<code>x2</code>, <code>y2</code>に設定されます。あとはそれぞれの<code>x</code>と<code>y</code>を足し算してタプルで返却しています。機能の内容が非常に分かりやすい表現になっていることが分かるかと思います。</p>



<p class="wp-block-paragraph">なお、この例は以下のように書き換えることもできます。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: haskell; title: ; notranslate">
addVectors&#039; :: (Num a, Num b) =&gt; (a, b) -&gt; (a, b) -&gt; (a, b)
addVectors&#039; a b = (fst a + fst b, snd a + snd b)
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
【関数使用結果例】
ghci&gt; addVectors&#039; (1, 2) (3, 4)
(4,6)
</pre></div>


<p class="wp-block-paragraph">この実装では、1つ目のタプルを<code>a</code>に、2つ目のタプルを<code>b</code>に受け取っています。<code>fst</code>は、タプルから先頭要素を取得する関数で、<code>snd</code>はタプルから2番目の要素を取得する関数ですので、これにより同様のことができることが分かります。</p>



<p class="wp-block-paragraph">同じことが表現できることはできるのですが、上記のタプルパターンでの記載の方が処理の内容がイメージしやすく、可読性が高いことが分かるかと思います。</p>



<h3 class="wp-block-heading">コンストラクタパターン</h3>



<p class="wp-block-paragraph">データコンストラクタの形に対してマッチさせるパターンを<span class="marker"><strong>コンストラクタパターン</strong></span>と言います。以下の簡単な例で見てみましょう。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: haskell; title: ; notranslate">
data Shape = Circle Float | Rectangle Float Float

area :: Shape -&gt; Float
area (Circle r) = pi * r * r
area (Rectangle w h) = w * h
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
【関数使用結果例】
ghci&gt; area (Circle 5)
78.53982
ghci&gt; area (Rectangle 2 5)
10.0
</pre></div>


<p class="wp-block-paragraph">上記例では、<code>Shape</code>という型を定義しており、<code>Circle</code>(円)または<code>Rectangle</code>(矩形)を表すものになっています。それぞれのデータコンストラクタでは、<code>Circle</code>(円)は半径(<code>Float</code>)、<code>Rectangle</code>(矩形)は、幅(<code>Float</code>)と高さ(<code>Float</code>)を引数に取るものとして定義しています。データコンストラクタの説明は今回の主題ではないので詳細は割愛します。</p>



<p class="wp-block-paragraph">この場合、<code>area</code>関数は、半径が設定されている<code>Circle</code>として「<code>(Circle r)</code>」や幅・高さが設定された<code>Rectangle</code>として「<code>(Rectangle w h)</code>」を引数にとり、それぞれ面積を求めることができます。</p>



<p class="wp-block-paragraph">コンストラクタパターンを使うことでデータコンストラクタの形状に合わせた関数の定義が可能です。</p>



<h3 class="wp-block-heading">レコードパターン</h3>



<p class="wp-block-paragraph">Haskellのデータ定義では、レコード構文を使うことで項目に名称を付けることができるようになります。このレコード構文で定義したデータに対してマッチさせるパターンを<span class="marker"><strong>レコードパターン</strong></span>と言います。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: haskell; title: ; notranslate">
data Person = Person {name :: String, age :: Int} deriving (Show)

greet :: Person -&gt; String
greet (Person {name = n}) = &quot;Hello, &quot; ++ n ++ &quot;!&quot; 
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
【関数使用結果例】
ghci&gt; greet (Person {name = &quot;Taro&quot;, age = 30})
&quot;Hello, Taro!&quot;
</pre></div>


<p class="wp-block-paragraph">上記の例では、<code>Person</code>という型を定義しており、<code>Person</code>は名前(<code>name :: String</code>)と年齢(<code>age :: Int</code>)の情報を持っています。レコード構文の説明は今回の主題ではないので詳細は割愛します。</p>



<p class="wp-block-paragraph">この場合、<code>greet</code>関数は、<code>Person</code>の値を引数にとって、<code>Person</code>の中の情報をもとに挨拶をする処理を実行しています。「<code>greet (Person {name = n}</code>)のようにすることで引数の<code>name</code>の値を<code>n</code>に設定して使用することができます。今回年齢の<code>age</code>は使わないので記載していません。もちろん「<code>greet (Person {name = n, age = a})</code>」とすれば、年齢についても関数内で扱うことができます。</p>



<p class="wp-block-paragraph">レコードパターンを使うことで、レコード構文で定義したデータ型の形状に合わせた関数の定義が可能です。</p>



<h3 class="wp-block-heading">ガード付きパターン</h3>



<p class="wp-block-paragraph">パターンを定義するときに条件に従って表記する方法を<span class="marker"><strong>ガード付きパターン</strong></span>といいます。正確にはパターンというよりは、パターン記載時の条件設定という方が適切ですが、分かりやすさを考慮してパターンと記載することにします。</p>



<p class="wp-block-paragraph">ガード付きパターンでは、条件を記載することで処理結果を分岐させることができます。以下は、絶対値を返却する<code>abs</code>関数を、<code>abs'</code>関数として自分で実装してみた例です</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: haskell; title: ; notranslate">
abs&#039; :: (Num a, Ord a) =&gt; a -&gt; a
abs&#039; x
    | x &lt; 0     = -x
    | otherwise = x
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
【関数使用結果例】
ghci&gt; abs&#039; 10
10
ghci&gt; abs&#039; (-10)
10
</pre></div>


<p class="wp-block-paragraph">ガード付きパターンでは、「<code>|</code>」を使って条件を列挙していきます。上記では、<code>x</code>が<code>0</code>より小さい場合(<code>x &lt; 0</code>)にはマイナスをかけて絶対値にして返却します。それ以外を表す条件は「<code>otherwise</code>」で記載することができ、上記では<code>x</code>をそのまま返却しています。</p>



<h3 class="wp-block-heading">ASパターン</h3>



<p class="wp-block-paragraph">引数で受けっとった部分をある変数に設定して扱いたいときには、<span class="marker"><strong>ASパターン</strong></span>を使用します。以下の例で見てみましょう。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: haskell; title: ; notranslate">
firstAndRest :: String -&gt; String
firstAndRest &quot;&quot; = &quot;Empty&quot;
firstAndRest all@(x:xs) = &quot;The First letter of &quot; ++ all 
                        ++ &quot; is &quot; ++ &#x5B;x] ++ &quot;. The rest is &quot; ++ xs
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
【関数使用結果例】
ghci&gt; firstAndRest &quot;&quot;
&quot;Empty&quot;
ghci&gt; firstAndRest &quot;Haskell!&quot;
&quot;The First letter of Haskell! is H. The rest is askell!&quot;
</pre></div>


<p class="wp-block-paragraph">上記の例では、リストパターンのように<code>String</code>の情報を引数に取っていますが、<code>(x:xs)</code>にあたる部分を<code>all</code>という変数に設定しています。この時に設定する場合には、<span class="marker"><strong>変数名@</strong></span>という表記を使用します。</p>



<p class="wp-block-paragraph"><code>x</code>はリストの先頭、<code>xs</code>は残りの部分です。つまり、<code>(x:xs)</code>というのは入力された<code>String</code>全体のことを表します。そのため、関数内で<code>all</code>を使用すると受けった<code>String</code>全体を表すわけです。</p>



<p class="wp-block-paragraph">このようにASパターンをうまく利用すると指定した変数に値を設定してうまく扱うことが可能になります。</p>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">Haskellの関数実装において非常に重要な<span class="marker"><strong>パターンマッチ</strong></span>の使い方の基本について解説しました。</p>



<p class="wp-block-paragraph">パターンマッチは、異なる引数の形に基づいて異なる定義を行うことができる非常に強力な機能であり、Haskellの関数定義において非常に重要な役割を持っています。本記事では、パターンマッチの代表的なパターンを例に使って使用方法の基本を紹介しました。</p>



<p class="wp-block-paragraph">パターンマッチは組み合わせにより非常に表現力が高くなり、関数定義の幅が広がります。ぜひ使用方法の基本を理解してもらえればと思います。</p>



<figure class="wp-block-embed is-type-wp-embed is-provider-haskell-tech wp-block-embed-haskell-tech"><div class="wp-block-embed__wrapper">
https://haskell-tech.nkhn37.net/haskell-introduction/
</div></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://haskell-tech.nkhn37.net/haskell-function-pattern-match/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Disk: Enhanced  を使用したページ キャッシュ

Served from: haskell-tech.nkhn37.net @ 2026-08-19 21:52:48 by W3 Total Cache
-->