<?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>関数型プログラミング &#8211; システム開発・AI導入なら株式会社taiziii（タイジー</title>
	<atom:link href="https://taiziii.com/column_cat/functional-programming/feed/" rel="self" type="application/rss+xml" />
	<link>https://taiziii.com</link>
	<description>事業理解に強いITコンサルタントとフルスタックエンジニアが、Webサービス・アプリ・業務システムを戦略設計から実装・保守運用まで一気通貫で支援。AI活用や内製化支援で成果に直結する開発を実現します。</description>
	<lastBuildDate>Wed, 19 Feb 2025 16:26:50 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.2</generator>

<image>
	<url>https://taiziii.com/wp-content/uploads/2023/10/favicon.ico</url>
	<title>関数型プログラミング &#8211; システム開発・AI導入なら株式会社taiziii（タイジー</title>
	<link>https://taiziii.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>関数型プログラミング入門 4 （型付ラムダ計算編）</title>
		<link>https://taiziii.com/column/399/</link>
		
		<dc:creator><![CDATA[THiNGMAjiG_admin_user_kato]]></dc:creator>
		<pubDate>Thu, 10 Aug 2023 12:33:09 +0000</pubDate>
				<guid isPermaLink="false">https://taiziii.com/?post_type=column&#038;p=399</guid>

					<description><![CDATA[今回は、関数型プログラミングに関する内容だね！ 前回に引き続き、関数型プログラミングの理論的背景について一緒に学んでいきましょう！ 本記事で学べること ・型付ラムダ計算 はじめに 関数型プログラミング入門 3 でラムダ計 [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="balloonWrap">
<div class="balloon2-left">
<p>今回は、関数型プログラミングに関する内容だね！</p>
</div>
<div class="balloon2-right">
<p>前回に引き続き、関数型プログラミングの理論的背景について一緒に学んでいきましょう！</p>
</div>
</div>
<h2>本記事で学べること</h2>
<p>・型付ラムダ計算</p>
<h2>はじめに</h2>
<p>関数型プログラミング入門 3 でラムダ計算の学習を終え、型付ラムダ計算について学ぶ準備ができたと思います。それでは早速、型付ラムダ計算について説明していきましょう。</p>
<p>&nbsp;</p>
<p><span style="font-size: 8pt;">(ラムダ計算に関してはこちらをチェック↓)</span></p>
<p><span style="color: #3366ff;"><a style="color: #3366ff;" href="https://taiziii.com/column/392/" target="_blank" rel="noopener">関数型プログラミング入門 3（ラムダ計算編）</a></span></p>
<h2>型付ラムダ計算</h2>
<p>型付ラムダ計算とは、ラムダ項に型をつけた形で計算を行うことをいいます。型は、基本型か、型 A, B を用いて A → B の形をした関数の型に分けられ、基本型には、例えば、整数の型 i や真偽値の型 o などが用いられます。<br />
各変数にはその型が定まっているとします。例えば、変数 z の型は o で、変数 f の型は i → i という感じです。もし、変数 f の型が i → i で変数 a の型が i だった場合、fa の型は i になります。<br />
ここで、ラムダ項は変数をもとに抽象と適用によって作られることを思い出しましょう。したがって、抽象と適用に対して型を定める規則を用意すれば、各々のラムダ項に型を定めることができます。λa.M という抽象は、a の型が A で M の型が B であれば、A → B というように定まります。また、MN という適用は、M の型が A → B で N の型が A であれば、B という型が定まります。<br />
適用 MN に関しては、M の型が A → B という形をしていないか、もししていても N の型が A でない場合は型が定まらず、間違ったラムダ項になります。</p>
<h2>型と簡約</h2>
<p>ラムダ計算編のところで、β 簡約について学びました。ここで問題なのが、 β 簡約をしても型が保存されるのか、ということです。例えば、x, y, w の型を i として、(λx.λy.x)w というラムダ項を考えてみましょう。このとき、λx.λy.x の型は i → i → i で、w の型は i であるので、適用によって、(λx.λy.x)w の型は i → i となります。一方、(λx.λy.x)w を β 簡約した形が λy.w となります。このラムダ項の型も、同様に、i → i となり、 β 簡約前の型と一致します。一般に、ラムダ項の型は、β 簡約後も保存されます。これは、先の節で紹介した抽象と適用に対して型を定める規則が上手くできているためです。<br />
余談ですが、正規化定理によって、β 簡約の停止性が証明されています。つまり、β 簡約は必ず有限ステップで停止します。</p>
<h2>まとめ</h2>
<p>本記事では型付ラムダ計算について解説をしました。ぜひ、本記事の内容をもとにして、より良い関数型プログラムを書いて欲しいところです。また、型付ラムダ計算には、証明とプログラムを対応づけるカリー・ハワード対応という非常に面白い考え方があります。これは、プログラムの高品質化に関わっている、最近ホットな話題といえます。こちらも機会があれば紹介したいと思います。では、さようなら〜。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>関数型プログラミング入門 3（ラムダ計算編）</title>
		<link>https://taiziii.com/column/392/</link>
		
		<dc:creator><![CDATA[THiNGMAjiG_admin_user_kato]]></dc:creator>
		<pubDate>Wed, 09 Aug 2023 09:41:54 +0000</pubDate>
				<guid isPermaLink="false">https://taiziii.com/?post_type=column&#038;p=392</guid>

					<description><![CDATA[今回は、関数型プログラミングに関する内容だね！ 関数型プログラミングの理論的背景について一緒に学んでいきましょう！ 本記事で学べること ・ラムダ計算 はじめに 関数型プログラミング入門 2 では、関数型プログラミングの機 [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="balloonWrap">
<div class="balloon2-left">
<p>今回は、関数型プログラミングに関する内容だね！</p>
</div>
<div class="balloon2-right">
<p>関数型プログラミングの理論的背景について一緒に学んでいきましょう！</p>
</div>
</div>
<h2>本記事で学べること</h2>
<p>・ラムダ計算</p>
<h2>はじめに</h2>
<p>関数型プログラミング入門 2 では、関数型プログラミングの機能面について見ていきました。そこで今回から、関数型プログラミングの理論的背景を学んでいこうと思います。目標は、型付ラムダ計算を理解することですが、その前にラムダ計算について学習することから始めましょう。型付ラムダ計算は、関数型プログラム言語の基盤であるため、これを理解することができれば、関数型プログラムの扱いが格段に上達すると思います。</p>
<h2>ラムダ計算</h2>
<h3>基本</h3>
<p>変数 a, b, c, … が与えられたとき、次のような表現をラムダ項といいます。</p>
<p style="text-align: center;">a (λa.M) (MN)</p>
<p>ただし、M, N もそれ自体ラムダ項とします。 (λa.M) の形のラムダ項を抽象、(MN) の形のラムダ項を適用といいます。(MN) は、関数 M を入力 N に対して使うことに相当します。また、λ の横にある変数は束縛変数といい、それ以外の変数を自由変数といいます。例えば、(λa.ab) の中で a は束縛変数、b は自由変数です。λa は述語論理の ∃x や ∀x と同じようなものだと理解して構いません。<br />
ラムダ項で使われるカッコは適宜省略することにしましょう。例えば、MNK は (MN)K を意味します。また、λa.λb は λab と表記することにします。<br />
&nbsp;</p>
<h3>計算のルール</h3>
<p>計算は次のように行われます。</p>
<p style="text-align: center;">(λa.M(a))N →β M(N)</p>
<p>λa から始まるラムダ抽象に値 N が適用されたら、変数 a に N を代入します。ここで、左側の項を β 基といい、これを右側に書き換えることを β 簡約といい、→β　で表します。 β 基をどんどん簡約していくことが、ラムダ項の計算法です。</p>
<p>&nbsp;</p>
<h3>具体例</h3>
<p>ここからは、色々な計算の具体例を見ていって、ラムダ計算に慣れていきましょう。<br />
まず、ラムダ計算における真偽の表し方を紹介します。</p>
<p style="text-align: center;">T := λab.a F : = λab.b</p>
<p>最初の引数である a を返すのが T で、後の引数である b を返すのが F です。具体的には、</p>
<p style="text-align: center;">T M N ≡ (λab.a) M N →β (λb.M) N →β M<br />
F M N ≡ (λab.b) M N →β (λb.b) N →β N</p>
<p>(λb.M) N →β M では、変数 b が M に含まれないとして、単に N を消去しています。<br />
次に、関数の合成を見ていきましょう。M と N を関数として見ると、N の出力を M に渡せばいいから、</p>
<p style="text-align: center;">M ○ N := λa.M(Na)</p>
<p>と表せます。3つの関数の合成ならば、</p>
<p style="text-align: center;">M ○ N ○ K := λa.M(N(Ka))</p>
<p>となります。<br />
次に、自然数の表現について説明します。ラムダ計算では、自然数 0, 1, 2, 3, … を</p>
<p style="text-align: center;">λfa.a, λfa.fa, λfa.f(fa), λfa.f(f(fa)), …</p>
<p>を表します。これらをチャーチ数項といいます。省略表現として、</p>
<p style="text-align: center;">0, 1, 2, 3, …</p>
<p>として表すこともあります。チャーチ数項 n を用いれば、「P から出発して Q を n 回繰り返すこと」を n P Q で表すことができます。例えば n が 3 の場合は、次のようになります。</p>
<p style="text-align: center;">3 Q P ≡ λfa.f(f(fa)) Q P →β λa.Q(Q(Qa)) →β Q(Q(Q P))</p>
<p>合成の記号 ○ を用いれば、チャーチ数項 n は</p>
<p style="text-align: center;">λf. f ○ ・・・ ○f (n回)</p>
<p>と書くこともできます。つまり、「与えられた関数を n 回合成すること」として 自然数 n を表しています。<br />
また、足し算や掛け算は次のように定義できます。</p>
<p style="text-align: center;">M + N := λg.Mg ○Ng<br />
M・N := λg.M Ng</p>
<p>足し算では、M と N がチャーチ数項の場合、「g を M 回繰り返した関数」と 「g を N 回繰り返した関数」の合成であるため、全体は「g を M + N 回繰り返した関数」となっています。掛け算では、掛け算では 関数が M・N 回出てくることがわかります。一応、具体例を見ておきましょう。</p>
<p style="text-align: center;">2 + 3 ≡ λg.(λf.f ○ f)g ○ (λf.f ○ f ○ f)g →β λg.(g ○ g) ○ (g ○ g ○ g) →β λg. g ○ g ○ g ○ g ○ g ≡ 5</p>
<p style="text-align: center;">2・3 ≡ λg.(λf.f ○ f)((λf.f ○ f ○ f)g) →β λg.(λf.f ○ f)(g ○ g ○ g ) →β λg.(g ○ g ○ g ) ○ (g ○ g ○ g ) →β λg.g ○ g ○ g ○ g ○ g ○ g ≡ 6</p>
<h2>まとめ</h2>
<p>本記事では、ラムダ計算について解説しました。これで型付ラムダ計算の説明に入る準備ができたと思います。ということで、次回は型付ラムダ計算の仕組みについて書いていきます。お楽しみに！</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>関数型プログラミング入門 2（機能編）</title>
		<link>https://taiziii.com/column/382/</link>
		
		<dc:creator><![CDATA[THiNGMAjiG_admin_user_kato]]></dc:creator>
		<pubDate>Wed, 02 Aug 2023 10:54:56 +0000</pubDate>
				<guid isPermaLink="false">https://taiziii.com/?post_type=column&#038;p=382</guid>

					<description><![CDATA[今回は、関数型プログラミングに関する内容だね！ 関数型プログラミングの特徴について学べるんですよね！ 本記事で学べること ・関数型プログラミングの特徴 ・関数型プログラミングの型 はじめに 前回は関数型プログラミングのす [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="balloonWrap">
<div class="balloon2-left">
<p>今回は、関数型プログラミングに関する内容だね！</p>
</div>
<div class="balloon2-right">
<p>関数型プログラミングの特徴について学べるんですよね！</p>
</div>
</div>
<h2>本記事で学べること</h2>
<p>・関数型プログラミングの特徴<br />
・関数型プログラミングの型</p>
<h2>はじめに</h2>
<p>前回は関数型プログラミングのすごさを感じてもらうために、関数型プログラミングを採用するメリットについて説明しました。そこで今回は、前回紹介した関数型プログラミングのメリットにつながる特徴と、加えて、関数型プログラミングが扱う型について紹介したいと思います。</p>
<h2>関数型プログラミングの特徴</h2>
<h3>高階関数</h3>
<p>関数型プログラミングでは、整数や文字列などの対象（第一級の対象）と同じように、関数を第一級の対象として扱います。したがって、関数を引数として受けとったり、結果として返したりする高階関数を定義することができます。高階関数を使えば、よく使われる計算パターンをシンプルに記述することができるため、プログラムをきれいに書き表すことができます。複雑な計算も高階関数の組み合わせによって処理することができるため、プログラムのモジュール性（独立した部品から組み立てられている傾向）が高くなります。</p>
<p>&nbsp;</p>
<h3>参照透明性</h3>
<p>関数型プログラミングが扱う純粋な関数は、プログラムの他の部分に影響（副作用）を与えず、また、他の部分から影響を受けることもありません。つまり、関数はどこで実行されてもいつでも同じ結果を出してくれます。これを参照透明性といいます。参照透明性により、関数型プログラムを数学的に扱うことが可能になります。具体的には、プログラム変換や解析を簡単に行うことができます。</p>
<p>&nbsp;</p>
<h3>遅延評価</h3>
<p>関数型プログラム言語の中には、Haskell のように遅延評価が可能なものがあります。遅延評価とは、関数の呼び出し時に、引数の計算が必要なときだけ計算されるという評価の仕方です。遅延評価を使えば、宣言的にプログラムを書くことができ、たとえば、無限データを扱うことができます。また、巡回定義を含んだプログラムを無限ループを起こさずに定義のまま実行することが可能となります。</p>
<h2>関数型プログラミングの特徴</h2>
<p>型の概念は、命令型プログラミングでもありますが、特に関数型プログラムは型との相性がよいといわれています。</p>
<p>&nbsp;</p>
<h3>データ型</h3>
<p>基本的なデータ型には、整数型、実数型、文字列型、真偽値型などがあります。関数型プログラミングでは、プログラムの変数や式にデータ型を付与します。これを型付といい、型付は静的な型付と動的な型付で構成されています。静的な型付では、プログラムの実行前に型が定まり、動的な型付では実行後に型が定まります。間違いを含むプログラムにおいては、型が定まらないことが多いので、プログラムを実行する前に型のエラーが見つかれば、プログラムを実行せずに間違いを見つけることができます。</p>
<p>&nbsp;</p>
<h3>関数の型</h3>
<p>関数にも型を付与します。具体的には、関数の入力と出力の型を定めるということです。A というデータの型をもらって B という型のデータを返す関数の型は、A → B と書きます。A → B もデータ型の一種になります。 例えば 整数をもらって整数を返す関数の型は、整数の型を i とすれば、i → i で表せます。<br />
また、関数型プログラミングでは、高階関数が許されていたので、A → B を型とする関数をもらって、C という型のデータを返す関数にも型を持たすことができて、それは、(A → B) → C と表せます。逆に、C というデータの型をもらって、A → B を型とする関数を返す関数の型は、C → (A → B) と表すことができます。</p>
<h2>まとめ</h2>
<p>本記事では、関数型プログラミングの特徴と型について説明しました。次回は、関数型プログラミングの基本である、型付ラムダ計算を解説しようと思います。お楽しみに！</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>関数型プログラミング入門 1 （メリット編）</title>
		<link>https://taiziii.com/column/378/</link>
		
		<dc:creator><![CDATA[THiNGMAjiG_admin_user_kato]]></dc:creator>
		<pubDate>Tue, 01 Aug 2023 09:13:57 +0000</pubDate>
				<guid isPermaLink="false">https://taiziii.com/?post_type=column&#038;p=378</guid>

					<description><![CDATA[今回は、関数型プログラミングに関する内容だね！ この記事を読めば、関数型プログラミングのすごさを学べますね！ 本記事で学べること ・関数型プログラミングの概要 ・関数型プログラミングを使うメリット はじめに 近年において [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="balloonWrap">
<div class="balloon2-left">
<p>今回は、関数型プログラミングに関する内容だね！</p>
</div>
<div class="balloon2-right">
<p>この記事を読めば、関数型プログラミングのすごさを学べますね！</p>
</div>
</div>
<h2>本記事で学べること</h2>
<p>・関数型プログラミングの概要<br />
・関数型プログラミングを使うメリット</p>
<h2>はじめに</h2>
<p>近年において関数型プログラミングが注目されつつあります。これは、命令型プログラミングと比べて、様々な点において関数プログラミングが優れているからです。では具体的にどのような点で優れているのでしょうか。本記事では、関数プログラミングを使うメリットを紹介したいと思います。</p>
<h2>関数型プログラミングとは</h2>
<p>関数型プログラミングとは、関数のみを使ってプログラミングを行うスタイルのことをいいます。関数とは、 C 言語のような命令型プログラム言語でよく使われる処理の実行によってシステムに変化（副作用）が発生したり、 引数が同じでも状況に応じて戻り値が異なったりするものではなく、数学における純粋な関数のことをいいます。関数プログラム言語の代表例としては、Haskell や Lisp などが挙げられます。</p>
<h2>メリット</h2>
<h3>宣言的な記述</h3>
<p>一つ目の優れた点は、関数型プログラミングが宣言的であるということです。関数を使ってプログラムを書く場合、どのような処理を行うかということを端的に記述します。その結果、プログラムを簡潔で高水準に書くことができます。つまり、非常に複雑な処理やアルゴリズムを関数のシンプルな組み合わせで書くことができます。<br />
&nbsp;</p>
<h3>ソフトウェアの高品質化</h3>
<p>二つ目の点は、ソフトウェアの高品質化を実現できることです。純粋な関数を使ったプログラムは副作用がありません。したがって、関数を実行してもプログラムの他の部分に悪影響を及ぼすことがないのです。これにより、命令型プログラミングによって書かれたプログラムと比べて、プログラムを解析・検証しやすくなります。さらに、静的型付け機能により、プログラムの問題を素早く発見することができます。<br />
&nbsp;</p>
<h3>並列計算</h3>
<p>三つ目の点は、関数型プログラミングが並列計算に向いているということです。というのも、関数型プログラミングの関数は相互に独立しているため、並列性が内在しているからです。</p>
<h2>まとめ</h2>
<p>本記事では、関数型プログラミングを使うメリットについて紹介しました。次回は、今回紹介した関数型プログラミングの優れた点の背景にある、関数型プログラミングの特徴を紹介しようと思います。これから関数型プログラミングについて楽しく学んでいきましょう！</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
