プロ大学生の苦悶日記

来年大学に入って6年目になるプロが様々な味わってきた苦悶・溜飲を吐き出す場所

最近話題のElixirってどんなもの!?(1)

f:id:blueending3:20171028114547j:plain

こんにちは!

フリーランスでアプリからサイト制作している大学生です。

最近Elixirとか関数型言語という言葉を聞いたことがありませんか?

すでに熟知している方も多々いると思います。

今回改めてそのElixir、関数型言語について説明していきたいと思います。

 

 

関数型言語とは?

まずそもそも、言語にはオブジェクト指向関数型言語手続き型言語・定理証明支援系言語・ハイブリッドなど様々な種類があります。

オブジェクト指向はクラスやインスタンスなど車の開発のように設計図や操作する対象を決めて、その設計図を使いまわしたり、対象に対して様々な操作を行うように実際の生活モデリングのようにわかりやすくしている方法です。(ここではRubyオブジェクト指向を説明しています。)

例えば言語でいえば、Ruby, Python, Java, Javascript, Swift, PHP, Perl, C#, OCaml, などなどです。(諸説あり)

手続き型は上から書いた順に処理を実行してくれる言語です。

言語でいえば、C, Fortran, Cobol などです。(諸説あり)

ですが、その中で関数型とは一体どんなものでしょうか?

関数型言語Wikipediaには次のような一説があります。

 

何をもって関数型プログラミングとするか、関数型プログラミングを行っているコミュニティ内でも正確な定義や合意というものは存在しない

 

えええええ!

なにそれ!関数型言語めっちゃ曖昧!

そう。そうなのです。関数型言語は名前が実体に先行してしまっている感じはします。

ですが、一般的には次のような特徴を持っている言語は関数型言語と呼ばれています。

・関数ファースト

・イミュータブル

再帰

モナド

の4つが大きな特徴と言われています。

一つひとつ説明していきます。

 

#関数ファースト

関数ファーストとはファーストクラス関数を持っているということです。

関数をリテラルで表現できる。(ラムダ式

引数に関数を渡すことが出来る。

戻り値に関数を使うことが出来る。

この3つの性質を持つ関数をファーストクラス関数又は高階関数と呼びます。

 

 

#イミュータブル

#再帰

イミュータブルとは変数の再代入ができないということです。

つまりfor文などができないということです。

ここででてくるのが「再帰」という考え方です。

再帰」とは

自分の定義の中で自分自身を呼び出す方法です。

例としてはこのようになっています。

自分で自分を呼び出すため、イテレートの引数は何か変化を加えて何度も関数を実行していくという処理になっています。

 

#モナド

最後にモナドです。

モナドの説明が一番むずかしいので、大雑把に説明していきます。

まず関数型の前提から説明していきます。

関数型言語は、システムの状態遷移を余すところなく関数の入出力として表現しようとし、システムの動きを明確にしています。全てを入出力として表現するので、ビジネスロジックにとって重要な本来やりたい入出力以外のいらない入出力がどうしても必要になってきます。

関数間のデータ受け渡しにおいて、なんらかのあまり・おまけがでてきてしまいそれがエラーや値がnilだったりしてしまうことがあります。

しかし関数設計においてそのあまり・おまけは出来る限り仕事のジャマになるので考えたくない!

あまり・おまけを考慮せず純粋に処理したい部分だけ関数に組み込みたい!

そこでモナド

そこで処理するべき関数だけ書いても結果的におまけ・あまりへの対処も含めた関数を書けてしまう仕組みがモナドです。

詳しく突っ込んでいくと圏論などの数学の知識を必要としてくるため割愛致します。。

 

 

以上が関数型言語の特徴になっています。

他にも関数型言語は”カリー化”, “遅延評価”,”ファンクタ”,”アプリカティブ”などなどかっこいい名前の様々な特徴を持っていますのでぜひ調べてみて下さい。

関数型言語の例としては、

Elixir, Erlang, Lisp, Haskell, Scala, Clojure, SMLなどなどになっています。

 

今回の記事では関数型言語の説明でおわってしまったので次回以降Elixirについて説明していきます!

それでは!

(この記事について修正点・誤った認識などありましたらコメントよろしくお願いします。)