<?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%82%AB%E3%83%AA%E3%83%BC%E5%8C%96/feed/" rel="self" type="application/rss+xml" />
	<link>https://haskell-tech.nkhn37.net</link>
	<description>Haskell学習サイト</description>
	<lastBuildDate>Mon, 01 Apr 2024 21:57:58 +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-currying-partial/</link>
					<comments>https://haskell-tech.nkhn37.net/haskell-currying-partial/#respond</comments>
		
		<dc:creator><![CDATA[naoki-hn]]></dc:creator>
		<pubDate>Mon, 01 Apr 2024 20:00:00 +0000</pubDate>
				<category><![CDATA[関数]]></category>
		<category><![CDATA[currying]]></category>
		<category><![CDATA[partial]]></category>
		<category><![CDATA[カリー化]]></category>
		<category><![CDATA[部分適用]]></category>
		<guid isPermaLink="false">https://haskell-tech.nkhn37.net/?p=518</guid>

					<description><![CDATA[Haskellにおいて高階関数を理解するために重要となる「カリー化(Currying)」と「部分適用 (Partial Application)」について解説します。 カリー化と部分適用 高階関数とは、引数に関数を受けと]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Haskellにおいて高階関数を理解するために重要となる「<span class="marker"><strong>カリー化(Currying)</strong></span>」と「<span class="marker"><strong>部分適用 (Partial Application)</strong></span>」について解説します。</p>



<h2 class="wp-block-heading">カリー化と部分適用</h2>



<p class="wp-block-paragraph"><strong>高階関数</strong>とは、引数に関数を受けとったり、返り値として関数を返却できる関数のことを言います。高階関数は、Haskellのような関数型プログラミング言語では必要不可欠なものとなっています。</p>



<p class="wp-block-paragraph">高階関数について、理解するために覚えておくべき内容として「<span class="marker"><strong>カリー化(Currying)</strong></span>」と「<span class="marker"><strong>部分適用 (Partial Application)</strong></span>」という考え方があります。</p>



<p class="wp-block-paragraph">この記事では、カリー化と部分適用について説明します。</p>



<div class="wp-block-jin-gb-block-box concept-box5">
<p class="wp-block-paragraph">Haskellの関数の基本については「<a href="https://haskell-tech.nkhn37.net/haskell-function-basic/" target="_blank" rel="noreferrer noopener">関数の基本</a>」にまとめているので参考にしてください。</p>
</div>



<h3 class="wp-block-heading">カリー化 (currying)</h3>



<p class="wp-block-paragraph">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の関数における重要なポイントの1つは以下になります。</p>



<div class="wp-block-jin-gb-block-box concept-box1">
<p class="wp-block-paragraph"><span class="marker"><strong>Haskellのすべての関数は、引数を1つだけ取る</strong></span></p>
</div>



<p class="wp-block-paragraph">しかし、皆さんが関数を作成する際には、複数の引数をとる関数を作成してきたと思います。これはどういうことでしょうか。実際にはHaskellの関数は「<span class="marker"><strong>カリー化 (Currying)</strong></span>」された関数だったのです。カリー化について理解できると上記の引数を1つだけとるの意味を理解することができます。</p>



<p class="wp-block-paragraph">簡単な例を使って理解していきましょう。例として以下のような2つの整数を加算するような簡単な関数を考えてみましょう。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: haskell; title: ; notranslate">
add :: Int -&gt; Int -&gt; Int
add x y = x + y
</pre></div>


<p class="wp-block-paragraph">次の2つの呼び出し方は、結果としては同じになります。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
ghci&gt; add 1 2
3
ghci&gt; (add 1) 2
3
</pre></div>


<p class="wp-block-paragraph"><code>add</code>の型シグネチャは、「<code>Int -&gt; Int -&gt; Int</code>」ですが、これは「<code>Int -&gt; (Int -&gt; Int)</code>」と書くことができます。後者の記載では「<code>Int</code>」を1つ引数にとって、「<code>(Int -&gt; Int)</code>」つまりは <code>Int</code>を受け取って<code>Int</code>を返す関数を返却すると読むことができます。</p>



<p class="wp-block-paragraph">つまり、「add 1 2」というのは、実際には2つのステップを踏みます。</p>



<ol class="wp-block-list">
<li><code>add 1</code>が評価されて<code>1</code>を加算するような関数が返却されます。この関数は引数を1つ受け取る関数です。</li>



<li>ステップ1で返却された関数の引数に<code>2</code>を適用して、結果の<code>3</code>を返却する。</li>
</ol>



<p class="wp-block-paragraph">これは引数が3つ、4つ、…と増えていっても同じです。1つ引数が適用されて関数が返却され、次の引数が適用されてまた関数が返却されるというのが繰り返されます。このような関数をカリー化された関数といいます。</p>



<p class="wp-block-paragraph">「Haskellのすべての関数は、引数を1つだけ取る」の意味はご理解いただけたでしょうか。では、これは何がうれしいのでしょうか。それが以降で説明する部分適用になります。</p>



<h3 class="wp-block-heading">部分適用 (Partial Application)</h3>



<p class="wp-block-paragraph"><span class="marker"><strong>部分適用 (Partial Application)</strong></span>は、関数にその関数がとる引数の一部だけを提供し、残りの引数を受け取るような新しい関数を生成することを言います。</p>



<p class="wp-block-paragraph">先ほども見てきた<code>add</code>関数を使って、部分適用の例を見てみましょう。</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: haskell; title: ; notranslate">
add :: Int -&gt; Int -&gt; Int
add x y = x + y

-- 2を足し算する関数
add2 = add 2

-- 3を足し算する関数
add3 = add 3
</pre></div>

<div class="wp-block-syntaxhighlighter-code "><pre class="brush: plain; gutter: false; title: ; notranslate">
【実行結果例】
ghci&gt; add2 3
5
ghci&gt; add3 3
6
</pre></div>


<p class="wp-block-paragraph">上記の例では、<code>add</code>関数の引数<code>x</code>のみ値を渡して新しい関数を作成しています。先ほどカリー化でも見てきたように1つの引数だけ与えた場合には、返却値は関数となっているので、その関数に新しく名前(<code>add2</code>や<code>add3</code>)を付けて使うことができます。</p>



<p class="wp-block-paragraph">部分適用の利点は、既存の関数の再利用性とモジュール性を高めることができる点にあります。</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">関数の引数は最も汎用的なものから順に並べるというのがベストプラクティスです。これは部分適用によりモジュールの再利用性を高めやすくなるためです。</p>



<p class="wp-block-paragraph">例えば、HTTP通信のリクエスト組み立てるような関数を考えた時にホスト名は最も汎用的といえます。このような引数を左側に持ってきておくと、ホスト名を指定した関数を作っておいて、後続のパラメータのみ変動させて使うようなこともできるようになります。</p>
</div>



<h3 class="wp-block-heading">カリー化と部分適用の違い</h3>



<p class="wp-block-paragraph">上記で「カリー化」と「部分適用」について説明してきましたが、これらはよく混同されがちです。しかし、これらは明確に異なる概念です。</p>



<p class="wp-block-paragraph">カリー化は、複数の引数をとる関数を<span class="marker2">引数を1つだけ取る関数の連鎖に変換するプロセス</span>のこと自体を指します。一方で、部分適用は、複数の引数をとる関数の<span class="marker2">一部に引数を渡して新しい関数を生成すること</span>です。</p>



<p class="wp-block-paragraph">これらは、明確に異なった概念ですので区別して理解してください。</p>



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



<p class="wp-block-paragraph">Haskellにおいて高階関数を理解するために重要となる「<span class="marker"><strong>カリー化(Currying)</strong></span>」と「<span class="marker"><strong>部分適用 (Partial Application)</strong></span>」について解説しました。</p>



<p class="wp-block-paragraph">カリー化は、複数の引数をとる関数を、引数を1つだけ取る関数の連鎖に変換するプロセスのことです。部分適用は、複数の引数をとる関数の一部に引数を渡して新しい関数を生成することでカリー化と関連しています。</p>



<p class="wp-block-paragraph">この記事では、カリー化と部分適用について、簡単な例を使いながら紹介しました。これらの概念は、理解していなくてもプログラムすることはできるのですが、純粋関数型プログラミング言語であるHaskellの理解を深めるのに非常に重要なので、ぜひ理解していただきたいと思います。</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-currying-partial/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 20:51:38 by W3 Total Cache
-->