いつもお世話になっております。
今回は関数型プログラミングについてなのですが、自分の経験ではほんの一部、関数型プログラミングで記載し、メインの処理は他の言語に投げるような処理しか経験がなく、関数型プログラミングって一時騒がれた割にはあまり使われてないのかな?と疑問に思った次第です。そこで質問です
1.プログラム言語を選定するときに、関数型プログラミングを採用したい(したくない)と判断した材料ってどんなものがありましたか?
2.どのようなシステムで関数型プログラミングは生かされやすいと思いますか?
3.処理をがっつり書く(MVCだったら、モジュールに該当する部分)のには向いていないのでしょうか?
回答のほど、お願いいたします。
なお、抽象的な質問だと思うので 8/1のどこかで回答済にしたいと思っています。
以上
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答10件
0
私はHaskellを業務に使っています。
1.プログラム言語を選定するときに、関数型プログラミングを採用したい(したくない)と判断した材料ってどんなものがありましたか?
関数型プログラミングでは、プログラムの制御構造を、専用の構文などではなく、純粋な関数を使って明示的に表現します。一見やや遠回りですが、制御構造そのものがプログラムで扱えるため柔軟性が高く、また論理的な見通しがよくなることも多いです。私が関数型プログラミングを好む理由はこれに尽きます。
2.どのようなシステムで関数型プログラミングは生かされやすいと思いますか?
どんなものにも利用できますが、静的型付きの言語における関数型プログラミングは、扱うデータの構造が固定されている場合に特に有効です。そのため、通信やログなどの処理のほか、あまり実用に至ってはいませんが画像や音声の処理も簡潔に記述できます。これはオブジェクト指向プログラミングとは真逆で、オブジェクト指向は操作が固定されているものに対して高い記述力を発揮します。ゲームプログラミングでエンティティの挙動を表現するのにはオブジェクト指向のほうが向いていると思います。
3.処理をがっつり書く(MVCだったら、モデルに該当する部分)のには向いていないのでしょうか?
扱うモデルを、開発の過程でどう拡張していきたいかによります。特定のデータに対し、できることを増やしていきたいのならば関数型プログラミングが、やることがあらかじめ決まっており、扱う対象を増やしていきたいのならばオブジェクト指向プログラミングが適しています。しかし、関数型プログラミングをサポートする言語のほうが「処理に対する処理」が気軽に書きやすいため、より便利に感じることも多いです。
ちなみに、ビューやコントローラに関しては、関数型プログラミングだからといって特に書きやすかったり、書きにくかったりはしないと考えています。
投稿2015/08/04 13:06
編集2015/08/04 13:07総合スコア47
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
関数型プログラミングって、使いやすいですか?
難易度という点では、難しくて使いにくいです。
問題領域がうまくハマる場合は使いやすいです。
1.プログラム言語を選定するときに、関数型プログラミングを採用したい(したくない)と判断した材料
次の質問と重複する部分があるので、「関数型言語を選定した判断材料」に読み替えて回答します。
関数型言語を選ぶときに、どれくらい純粋(関数型)か、という視点がまずあります。
純粋型でなくていいなら、たとえC言語でも関数型プログラミングはできるでしょう。
(Cでもオブジェクト指向プログラミングはできる、と言われるのと同じで)
私はLispを学習中ですが、それは関数型指向の考え方を輸入して、
JavaScriptやRuby、Python、Java(8)、Scala、C♯など
現代のモダンな言語に輸出(応用)しようと考えたからです。
なぜHaskellのような純粋関数型でなかったのかといえば、
それは私が言語を道具として使う問題領域のためです(次の回答参照)。
かんたんに言うと、人間中心のシステムにはOOが向くので、
そこに関数型を部分的に適用するほうが使いやすいと考えました。
2.どのようなシステムで関数型プログラミングは生かされやすいと思いますか?
プログラミング言語の大きな分類として、
手続き型は機械(語)、オブジェクト指向型は自然言語(人間)、関数型は人工言語(数学)に、
それぞれ立場が近い言語だと、個人的には考えています。
たとえばCは中水準言語と呼ばれるように、機械に近いのでシンプルで早い。
オブジェクト指向は、人間の社会や言葉を(そのまま直接ではないにしろ)モデリングできる。
関数型は、数学的な問題が対象だとパワーを引き出せます。
じっさい、金融の分野で業務に採用されている事例があるようです。
また並列計算をする場合、副作用が干渉しない関数型が向きます。
(昔に関数型が流行った時期にも、並列計算は使用目的のひとつだったようです)
3.処理をがっつり書く(MVCだったら、モデルに該当する部分)のには向いていないのでしょうか?
むしろモデルが一番向いていると思います。
投稿2015/07/30 00:20
編集2015/07/30 00:23総合スコア5592
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/08/05 22:59
0
関数型プログラミングって一時騒がれた割にはあまり使われてないのかな?
言語を選ぶ理由は多くの場合「過去の資産」か「プラットフォーム」のため、良い言語であってもなかなか採用されることはありません。
1.プログラム言語を選定するときに、関数型プログラミングを採用したい(したくない)と判断した材料ってどんなものがありましたか?
採用しないと判断するのは上記の理由によるものです。
逆に関数型プログラミング言語を採用するとしたら以下の条件を満たした場合になります
- その言語が得意(あるいは今から勉強しようとしている)
- 過去の資産が不要
- 実行するのはWebアプリのサーバーか、デスクトップアプリケーションか、シェルスクリプトみたいに書き捨てて良いもの
- 他の人が保守する可能性が無い
2.どのようなシステムで関数型プログラミングは生かされやすいと思いますか?
関数型プログラミングの特徴として以下の2つが挙げられると思います。
- 高階関数
- イミュータビリティ
今どき高階関数はほとんどの言語で使えるので、イミュータビリティをどこで活かしやすいかという質問になると思いますが、
私の経験だとゲームAIのような状態を書き換えずに探索したいような場合にコードが書きやすかった覚えがアリます。
(Haskellのような言語では「型チェック」が極めて協力なのでバグを極力無くしたい場合には有効だと思いますが、これはHaskellの特徴であって関数型プログラミングの特徴ではないので)
3.処理をがっつり書く(MVCだったら、モデルに該当する部分)のには向いていないのでしょうか?
MVCのどこに一番向いていないかと言われたらモデルだと思います。
それは基本的に状態を保持するのはモデルでコントローラーとビューは状態を保持しない単なる関数として振る舞うことがやりやすいためです。
とは言っても大抵の関数型言語にWebフレームワークがありますし問題は無いでしょう。
投稿2015/07/30 01:42
総合スコア1342
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Haskellを多少摘まんだ程度で、モナドがギリギリ理解できている程度の知識しかありませんが、
私見を述べさせて貰います。
- 関数型プログラミングをするには関数型言語を使う必要があるというわけではない。
多くの言語を区別すると三種類に分かれると思います。
- 関数型プログラミングが考慮されていない言語(Cなど)
- 関数型プログラミングの考えを部分的に取り入れている言語(Pythonなど)
- 関数型プログラミングしかできない言語、いわゆる関数型言語(Haskellなど)
これら三つどれであっても関数型プログラミングは可能と言えば可能です。
ただ、言語によってやりやすさ、関数型プログラミングでなくなってしまうことを
防げるかどうかが違うだけなのです。
- 関数型プログラミングをするときは全てのコードを関数型プログラミングをする必要はない。
関数型プログラミングの何が一番つらいかというと副作用を伴う処理です。
ただの入出力であってもIOモナドなどを使う必要があり、いわゆる命令型よりも
複雑になってしまいます。
(簡単に書けるように発展しているので、それほど複雑でもないですけど、
やはりモナドを理解しないと何しているか分からないという複雑さが残ります)
なので、入出力部分などの関数型では書きにくいところは命令型で書いて、
計算部分は関数型で書くという手段も有りなのです。
以上を踏まえて、私自身は普通の言語(PythonやRuby等)で、
部分的に関数型プログラミングを取り入れている程度にしています。
ただ、関数型プログラミング自体を習うにはHaskell等の関数型言語の方が
断然しやすいという点があります。
投稿2015/07/29 22:30
総合スコア21737
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
話題にされているのは、lispやhaskellのような言語のことでしょうか。
実際にこれらの言語がメインで使われることは多くはありませんが、javaも関数型を取り入れましたし、マルチパラダイム言語での関数型の話をします。
確かに、副作用がない関数はマルチスレッドに向いていると思います。
でも、オブジェクト指向と組み合わせた時にまた違う利点が生まれます。
私がC#で関数型を利用して感じた点を2つ上げます。
Javaなどのクラスベースの言語では、たまにメソッド数が1つくらいしか定義しないクラスがあります。
継承やオブザーバクラスのようなクラスで、これらは本当に大した内容では無いのに新しいクラスとして
立派な名前を考えてやる必要があります。場合によってはそれらが大量に必要だったりします。
これらのクラスは、スーパークラスで受け取られ使われるため、立派で長い名前はファクトリーメソッドで
一回だけ呼ばれるだけだったりします。
これを関数型にすれば、新しいクラスをわざわざ作る必要もなく、クラス図が複雑になることも、名前を考えるのに辞書を引く必要もなくなります。
また、カリー化やクロージャも使ったことが有ります。これらを用いれば、引数に自由度が生まれて余計なクラスをわざわざ作る必要もなく、クラス図ry...
1.プログラム言語を選定するときに、関数型プログラミングを採用したい(したくない)と判断した材料ってどんなものがありましたか?
メソッド数が少ないクラスや差分が少ないサブクラスを大量に作る必要があるとき。
2.どのようなシステムで関数型プログラミングは生かされやすいと思いますか?
オブジェクト指向をどこで生かすのかという問題と同様にどこででも生かせる。
3.処理をがっつり書く(MVCだったら、モデルに該当する部分)のには向いていないのでしょうか?
向いている。どんどん使えばいいと思う。
投稿2015/07/29 15:49
総合スコア2883
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/29 16:28
0
つまんだ程度なのでマサカリ飛んできそうですが。
1.関数型言語があまり普及していないので使いづらいというのはあります。
妥協してC#+Rxで関数型っぽく書くのが手軽でいいです。自作ツールにはよく使います。
2.「データの流れ」に重きを置くシステムとかじゃないですかね。例えばセンサプログラミングとか。
あとHDLとかが関数型言語っぽくなってると凄く便利そうです。
3.逆にモデル書くほうが簡単だと思います。
モデル以外はIOを関数(イベントストリーム)とみなせる仕組みがないと辛いと思います。
投稿2015/07/29 14:18
総合スコア13551
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/29 14:28
0
***回答場所を間違えたので、あらためて投稿します。***
ともかく、使いやすいです。本格的な論文を書くより散文を書き散らかすような容易さがあります。たとえれば、大洋に大陸を作るよりも、思いつくままに小島を作って相互に呼び合うようにする方が楽だからです。年取る(現在73歳)と、根気がなくなるので、この散文的プログラミング方法ばかり使っています。
言語としてはLispを使っています。思いついたときにすぐ使えるのはemacs lispですが、必要に応じてemacsのCommon Lispモードにしています。少しまともなプログラムにするときは、このemacsでのプログラムをFranz Common LispにしてグラフィックスのCLXやCで書いたデバイスドライバなどを呼び出します。
Franz Common Lispは無料のサービス版で十分間に合います。FORTRANから始まりいろいろな言語を使ってきましたが、半世紀以上付き合えた言語はLispです。老後のためにLispに親しんでおくと良いと思います。
投稿2015/08/05 23:03
総合スコア14
0
すみません私も門外漢の口なのですが少し業務で触ったことがあるのでそのとき思ったことを書きます。
まず、実際使われることが少ないのは関数型を触れる技術者が少ないことにあると思います。
大抵のことは関数型でもできますが関数型でしかできないというようなものは少なく関数型のほうが有利だなと思うところや生産性がいいなと思う事はありました。
しかし、そもそも関数型を扱えるという人間は手続型に比べると難易度的にぐっと減るだろうという風に感じたことと市場性(要は人件費の安さ・調達のしやすさ)を考えると関数型が主流になることはないかなぁと感じています。
前述の方が書かれている短命データのマルチコアで使用の可能性とかの話だとそれこそGPUプログラミングとかのアカデミックだったりシミュレーション系だったりするほうでは活躍しそうですが商用での活躍自体は少ないかなぁと思います。
投稿2015/08/04 13:24
総合スコア29
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
自分も全くの門外漢ですが…
確かにこれまで繰り返し話題になり、最近また一部で盛り上がっているようですが、関数型プログラミング言語というのは、従来の手続き型、あるいはオブジェクト型のプログラミング言語に「取って代わる」ようなものではないのではないかと感じております。
また、関数型プログラミング自体、決して目新しいパラダイムでは無いです。
自分のような素人には、以下の連載がとても分かりやすかったです。
[入門]関数プログラミング―質の高いコードをすばやく直感的に書ける!
今後、高度な並列処理が必要になるような分野では威力を発揮するのでは無いでしょうか?
逆に言えば、従来使い慣れたプログラミング言語でうまく対応出来ている限り、無理して関数型プログラミング言語を使う必要もないと思います。
ただし、プログラミング言語という道具として直接使うかどうかは別として、その考え方自体はぜひ直ぐにでも身につけておくべきだと感じている今日このごろです。
投稿2015/07/29 14:26
総合スコア5936
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/07/29 14:51
0
関数型は門戸外ですが
- 関数型言語を使うには関数型の考え方が必要なので、そのスキルを持っている人を集めるのが難しいので関数型がなかなか使われないのではと思います。
- 関数型はデータのまとまりを表すというより、もっとシンプルなデータを処理していくのに向いていると思います。
- モジュールを書くのには適していると思います。モデルを表現するのには深い知識が必要そうですが。
と僕の浅はかの知識で回答しているとマサカリが飛んできそうなので、どなたかもっと深い知識のある方の質の良い解答をお待ちしたほうが良いかもしれません。
投稿2015/07/29 13:54
総合スコア2244
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。