こんにちは!
フリーランスでアプリからサイト制作、時々大学生をしているキクチです!
最近Elixirとか関数型言語という言葉を聞いたことがありませんか?
すでに知っている人も沢山いると思いますが、この記事では「Elixirと関数型言語」について紹介していきます!
関数型言語って何?
そもそも、言語の種類として「オブジェクト指向、関数型言語、手続き型言語、定理証明支援系言語、ハイブリッド」など数多くの種類があります。
その内の一つである「オブジェクト指向」についてまず説明します。
クラス・インスタンスなど、車の開発のように設計図や操作する物を決め、その設計図を使いまわしたり、対象に対して色々な操作をするように実際の生活モデリングのようにわかりやすくしている方法のことです。
(ここではRubyのオブジェクト指向を説明しております。)
例えば、言語で言うと「Ruby、Python、Java、Javascript、Swift、PHP、Perl、C#、 OCaml」などが当てはまります。(諸説ありますが。)
次に手続き型についてご説明します。
書いた順に上から処理を実行をするという言語です。
言語で言うと「C、Fortran、Cobol 」などが当てはまります。(こちらも諸説あります)
関数型言語って?
では、その中で「関数型」とは、どのようなものなのでしょうか?
次のような一説があります。
何をもって関数型プログラミングとするか、関数型プログラミングを行っているコミュニティ内でも正確な定義や合意というものは存在しない
引用:関数型言語のWikipediaより
「えええええーーーー!!!」
「なにそれ!?関数型言語ってめっちゃあいまい!」
そう、そうなんですよ。
関数型言語は実体よりも名前が先行してしまっている感じがありますね。
ですが、一般的には次のような特徴を持っている言語は「関数型言語」と呼ばれています。
・関数ファースト
・イミュータブル
・再帰
・モナド
の4つが大きな特徴と言われています。
一つひとつ説明していきます。
#関数ファースト
関数ファーストとはファーストクラス関数を持っているということです。
関数をリテラルで表現できる。(ラムダ式)
引数に関数を渡すことが可能。
戻り値に関数を使用することが可能。
この3つの性質を持つ関数のことを「ファーストクラス関数」または「高階関数」とよびます。
//関数のリテラル表現 val add = (x: Int, y: Int) => x + y println(add(1, 2)) // => 3 //関数を引数に渡す def funcadd(x: Int, f: (Int) => Int): Int = f(x) + x println(funcadd(3, (x: Int) => x * 2)) // => (3 * 2) + 3 => 9 //戻り値として関数を返す def backFun(x: Int): (Int) => Int = (n: Int) => (x + 1) * n val f = backFun(5) // (n: Int) => 6 * n println(f(3)) // 6 * 3 => 18
#イミュータブル
#再帰
イミュータブルとは変数の再代入が不可能ということ。
つまりfor文などができません。
ここで出てくる考え方が「再帰」です。
「再帰」とは
自分の定義の中で自分自身を呼び出す方法です。
datatype ‘a list = nil | :: of ‘a * ‘a list
例としてはこのようになっています。
自分で自分を呼び出すため、イテレートの引数は何か変化を加えて繰り返し関数を実行するという処理になっています。
#モナド
最後にモナドの説明です。
モナドの説明が一番難しいので、ざっくり説明していきます。
まず関数型の前提から説明していきます。
関数型言語は、システムの状態遷移を余すところなく関数の入出力として表現しようとして、システムの動きを明確にしています。
全て入出力として表現するので、ビジネスロジックにとって重要な本来やりたい入出力以外の不要な入出力が必要になってきます。
関数間のデータの受渡しで、なんらかの余りやオマケが出てしまい、それがエラーや値がnilになってしてしまうことがあります。
しかし関数設計においてその余りやオマケはなるべくジャマになるので考えたくない!
余りやオマケを考えずに、純粋に処理したいところだけを関数に組込たい!
そこでモナド!
そこで、処理すべき関数だけ書いても結果的に余りやオマケへの対処も含めた関数を書けちゃう仕組みが「モナド」となります。
詳細に突っ込んだ事を書くと、圏論など数学の知識を必要としてくるため割愛させていただきます・・・。
関数型言語の特徴は以上となります。
他にも関数型言語は「カリー化」、「遅延評価」、「ファンクタ」、「アプリカティブ
」など様々な特徴を持っていますのでぜひ調べてみて下さい。
名前がかっこいいですよね(笑)。
関数型言語の例としましては、
「Elixir、Erlang、 Lisp、 Haskell、 Scala、 Clojure、SML」などとなっております。
今回の記事では関数型言語の説明でおわってしまったので次回以降Elixirについて説明していきます!
それでは!
(内容について修正点や誤った点などありましたら、コメントいただけると助かります!)