質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.47%

  • 関数型プログラミング

    28questions

    関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

関数型プログラミングって、使いやすいですか?

受付中

回答 10

投稿 編集

  • 評価
  • クリップ 8
  • VIEW 8,542

tenraku

score 128

いつもお世話になっております。

今回は関数型プログラミングについてなのですが、自分の経験ではほんの一部、関数型プログラミングで記載し、メインの処理は他の言語に投げるような処理しか経験がなく、関数型プログラミングって一時騒がれた割にはあまり使われてないのかな?と疑問に思った次第です。そこで質問です


1.プログラム言語を選定するときに、関数型プログラミングを採用したい(したくない)と判断した材料ってどんなものがありましたか?

2.どのようなシステムで関数型プログラミングは生かされやすいと思いますか?

3.処理をがっつり書く(MVCだったら、モデルに該当する部分)のには向いていないのでしょうか?


回答のほど、お願いいたします。

なお、抽象的な質問だと思うので 8/1のどこかで回答済にしたいと思っています。


以上
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Stripe

    2015/07/30 22:18

    「関数型プログラミング」って、「関数型のプログラミング言語」の話ですか?それとも、言語を問わず「関数型のスタイルでプログラミングする」っていう意味ですか?

    キャンセル

回答 10

+11

私はHaskellを業務に使っています。

1.プログラム言語を選定するときに、関数型プログラミングを採用したい(したくない)と判断した材料ってどんなものがありましたか? 

関数型プログラミングでは、プログラムの制御構造を、専用の構文などではなく、純粋な関数を使って明示的に表現します。一見やや遠回りですが、制御構造そのものがプログラムで扱えるため柔軟性が高く、また論理的な見通しがよくなることも多いです。私が関数型プログラミングを好む理由はこれに尽きます。

2.どのようなシステムで関数型プログラミングは生かされやすいと思いますか? 

どんなものにも利用できますが、静的型付きの言語における関数型プログラミングは、扱うデータの構造が固定されている場合に特に有効です。そのため、通信やログなどの処理のほか、あまり実用に至ってはいませんが画像や音声の処理も簡潔に記述できます。これはオブジェクト指向プログラミングとは真逆で、オブジェクト指向は操作が固定されているものに対して高い記述力を発揮します。ゲームプログラミングでエンティティの挙動を表現するのにはオブジェクト指向のほうが向いていると思います。

3.処理をがっつり書く(MVCだったら、モデルに該当する部分)のには向いていないのでしょうか? 

扱うモデルを、開発の過程でどう拡張していきたいかによります。特定のデータに対し、できることを増やしていきたいのならば関数型プログラミングが、やることがあらかじめ決まっており、扱う対象を増やしていきたいのならばオブジェクト指向プログラミングが適しています。しかし、関数型プログラミングをサポートする言語のほうが「処理に対する処理」が気軽に書きやすいため、より便利に感じることも多いです。

ちなみに、ビューやコントローラに関しては、関数型プログラミングだからといって特に書きやすかったり、書きにくかったりはしないと考えています。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

つまんだ程度なのでマサカリ飛んできそうですが。

1.関数型言語があまり普及していないので使いづらいというのはあります。
妥協してC#+Rxで関数型っぽく書くのが手軽でいいです。自作ツールにはよく使います。

2.「データの流れ」に重きを置くシステムとかじゃないですかね。例えばセンサプログラミングとか。
あとHDLとかが関数型言語っぽくなってると凄く便利そうです。

3.逆にモデル書くほうが簡単だと思います。
モデル以外はIOを関数(イベントストリーム)とみなせる仕組みがないと辛いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/29 23:28

    回答ありがとうございます。

    1.やはり、現状ではつまみ食いする形で使うのがよさそうですね

    2.VHDL書いてた時は確かに、考え方は近いものがあったと思うので回路設計関連では、親和性ありそうですね。そちらでは流行ってるのでしょうかねぇ?自分は業務系システム担当しかしたことがないのでイマイチその辺の情報には疎いのでわかりませんが。

    3.よくある業務システム(Web系で、DBつながってる感じ)のモデルで書くというは軽い処理だったらいいのでしょうけど、1つが重い処理だと難しくないでしょうか?
    そもそも、軽くするように詳細設計で見直せって話なのかもしれませんが。

    余談:teratail界隈のドンはマサカリ担いだ金太郎なのかな?

    キャンセル

+2

Haskellを多少摘まんだ程度で、モナドがギリギリ理解できている程度の知識しかありませんが、
私見を述べさせて貰います。

1. 関数型プログラミングをするには関数型言語を使う必要があるというわけではない。

多くの言語を区別すると三種類に分かれると思います。
  • 関数型プログラミングが考慮されていない言語(Cなど)
  • 関数型プログラミングの考えを部分的に取り入れている言語(Pythonなど)
  • 関数型プログラミングしかできない言語、いわゆる関数型言語(Haskellなど)
これら三つどれであっても関数型プログラミングは可能と言えば可能です。
ただ、言語によってやりやすさ、関数型プログラミングでなくなってしまうことを
防げるかどうかが違うだけなのです。

2. 関数型プログラミングをするときは全てのコードを関数型プログラミングをする必要はない。

関数型プログラミングの何が一番つらいかというと副作用を伴う処理です。
ただの入出力であってもIOモナドなどを使う必要があり、いわゆる命令型よりも
複雑になってしまいます。
(簡単に書けるように発展しているので、それほど複雑でもないですけど、
やはりモナドを理解しないと何しているか分からないという複雑さが残ります)
なので、入出力部分などの関数型では書きにくいところは命令型で書いて、
計算部分は関数型で書くという手段も有りなのです。

以上を踏まえて、私自身は普通の言語(PythonやRuby等)で、
部分的に関数型プログラミングを取り入れている程度にしています。
ただ、関数型プログラミング自体を習うにはHaskell等の関数型言語の方が
断然しやすいという点があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

自分も全くの門外漢ですが…

確かにこれまで繰り返し話題になり、最近また一部で盛り上がっているようですが、関数型プログラミング言語というのは、従来の手続き型、あるいはオブジェクト型のプログラミング言語に「取って代わる」ようなものではないのではないかと感じております。
また、関数型プログラミング自体、決して目新しいパラダイムでは無いです。

自分のような素人には、以下の連載がとても分かりやすかったです。

[入門]関数プログラミング―質の高いコードをすばやく直感的に書ける!

今後、高度な並列処理が必要になるような分野では威力を発揮するのでは無いでしょうか?
逆に言えば、従来使い慣れたプログラミング言語でうまく対応出来ている限り、無理して関数型プログラミング言語を使う必要もないと思います。

ただし、プログラミング言語という道具として直接使うかどうかは別として、その考え方自体はぜひ直ぐにでも身につけておくべきだと感じている今日このごろです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/29 23:51

    回答ありがとうございます。

    ozwkさんの回答からもある通り、並行処理に関連するものがキーとなるようですね。
    確かに今までのオブジェクト指向のマルチスレッド処理って書きにくいから注意しないといけないことが多かったですから、そこが改善しやすいといったことになるのでしょうかね。

    となると注目すべきはWeb系の処理はどうしても、マルチスレッドになるので、期待できるか?と思いたいですが、あんまりイメージわかないのでたぶんそういうことではないんでしょうねぇ。

    > その考え方自体はぜひ直ぐにでも身につけておくべきだと感じている今日このごろです。
    自分もそう思うのですが、考え方を”身に着ける”のはなかなか難しいですよね。オブジェクト指向の時も自分は結構苦戦した方なので。こいつも手ごわそうです。

    キャンセル

+1

話題にされているのは、lispやhaskellのような言語のことでしょうか。
実際にこれらの言語がメインで使われることは多くはありませんが、javaも関数型を取り入れましたし、マルチパラダイム言語での関数型の話をします。

確かに、副作用がない関数はマルチスレッドに向いていると思います。
でも、オブジェクト指向と組み合わせた時にまた違う利点が生まれます。

私がC#で関数型を利用して感じた点を2つ上げます。

Javaなどのクラスベースの言語では、たまにメソッド数が1つくらいしか定義しないクラスがあります。
継承やオブザーバクラスのようなクラスで、これらは本当に大した内容では無いのに新しいクラスとして
立派な名前を考えてやる必要があります。場合によってはそれらが大量に必要だったりします。

これらのクラスは、スーパークラスで受け取られ使われるため、立派で長い名前はファクトリーメソッドで
一回だけ呼ばれるだけだったりします。

これを関数型にすれば、新しいクラスをわざわざ作る必要もなく、クラス図が複雑になることも、名前を考えるのに辞書を引く必要もなくなります。

また、カリー化やクロージャも使ったことが有ります。これらを用いれば、引数に自由度が生まれて余計なクラスをわざわざ作る必要もなく、クラス図ry...

1.プログラム言語を選定するときに、関数型プログラミングを採用したい(したくない)と判断した材料ってどんなものがありましたか? 
メソッド数が少ないクラスや差分が少ないサブクラスを大量に作る必要があるとき。
2.どのようなシステムで関数型プログラミングは生かされやすいと思いますか? 
オブジェクト指向をどこで生かすのかという問題と同様にどこででも生かせる。
3.処理をがっつり書く(MVCだったら、モデルに該当する部分)のには向いていないのでしょうか? 
向いている。どんどん使えばいいと思う。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/30 01:28

    回答ありがとうございます。

    > これを関数型にすれば、新しいクラスをわざわざ作る必要もなく、クラス図が複雑にな> ることも、名前を考えるのに辞書を引く必要もなくなります。
    > また、カリー化やクロージャも使ったことが有ります。これらを用いれば、引数に自由> 度が生まれて余計なクラスをわざわざ作る必要もなく、クラス図ry...
    詳細設計時に楽はできそうですね

    > メソッド数が少ないクラスや差分が少ないサブクラスを大量に作る必要があるとき。
    単一な動作しかもたないようなクラスが多い時はやりやすそうですね

    > 向いている。どんどん使えばいいと思う。
    記載方法として扱うには、モデルに書く場合でも問題なさそうですね

    キャンセル

+1

すみません私も門外漢の口なのですが少し業務で触ったことがあるのでそのとき思ったことを書きます。

まず、実際使われることが少ないのは関数型を触れる技術者が少ないことにあると思います。
大抵のことは関数型でもできますが関数型でしかできないというようなものは少なく関数型のほうが有利だなと思うところや生産性がいいなと思う事はありました。

しかし、そもそも関数型を扱えるという人間は手続型に比べると難易度的にぐっと減るだろうという風に感じたことと市場性(要は人件費の安さ・調達のしやすさ)を考えると関数型が主流になることはないかなぁと感じています。

前述の方が書かれている短命データのマルチコアで使用の可能性とかの話だとそれこそGPUプログラミングとかのアカデミックだったりシミュレーション系だったりするほうでは活躍しそうですが商用での活躍自体は少ないかなぁと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

関数型は門戸外ですが

1. 関数型言語を使うには関数型の考え方が必要なので、そのスキルを持っている人を集めるのが難しいので関数型がなかなか使われないのではと思います。
2. 関数型はデータのまとまりを表すというより、もっとシンプルなデータを処理していくのに向いていると思います。
3. モジュールを書くのには適していると思います。モデルを表現するのには深い知識が必要そうですが。

と僕の浅はかの知識で回答しているとマサカリが飛んできそうなので、どなたかもっと深い知識のある方の質の良い解答をお待ちしたほうが良いかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/29 22:58

    回答ありがとうございます。

    > もっとシンプルなデータを処理していくのに向いていると思います。
    ですので、(厳密な関数型プログラミングではないですが)自分が触ったものだとF#で簡単なコントローラと処理を書いてあとはC#にお任せ。みたいな形でつまみ食いするような使い方してるのは触れたことあります。

    > モジュールを書くのには適していると思います。モデルを表現するのには深い知識が必要そうですが。
    MVCでのモジュールって意味わかりませんね・・・。失礼しました。

    キャンセル

0

***回答場所を間違えたので、あらためて投稿します。***

ともかく、使いやすいです。本格的な論文を書くより散文を書き散らかすような容易さがあります。たとえれば、大洋に大陸を作るよりも、思いつくままに小島を作って相互に呼び合うようにする方が楽だからです。年取る(現在73歳)と、根気がなくなるので、この散文的プログラミング方法ばかり使っています。
  言語としてはLispを使っています。思いついたときにすぐ使えるのはemacs lispですが、必要に応じてemacsのCommon Lispモードにしています。少しまともなプログラムにするときは、このemacsでのプログラムをFranz Common LispにしてグラフィックスのCLXやCで書いたデバイスドライバなどを呼び出します。
  Franz Common Lispは無料のサービス版で十分間に合います。FORTRANから始まりいろいろな言語を使ってきましたが、半世紀以上付き合えた言語はLispです。老後のためにLispに親しんでおくと良いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/13 10:47

    これから現役で実務に励もうという者に対して老後の趣味を勧めるのはいかがなものか。

    キャンセル

-1

関数型プログラミングって、使いやすいですか?
難易度という点では、難しくて使いにくいです。
問題領域がうまくハマる場合は使いやすいです。


1.プログラム言語を選定するときに、関数型プログラミングを採用したい(したくない)と判断した材料
次の質問と重複する部分があるので、「関数型言語を選定した判断材料」に読み替えて回答します。

関数型言語を選ぶときに、どれくらい純粋(関数型)か、という視点がまずあります。
純粋型でなくていいなら、たとえC言語でも関数型プログラミングはできるでしょう。
(Cでもオブジェクト指向プログラミングはできる、と言われるのと同じで)


私はLispを学習中ですが、それは関数型指向の考え方を輸入して、
JavaScriptやRuby、Python、Java(8)、Scala、C♯など
現代のモダンな言語に輸出(応用)しようと考えたからです。

なぜHaskellのような純粋関数型でなかったのかといえば、
それは私が言語を道具として使う問題領域のためです(次の回答参照)。

かんたんに言うと、人間中心のシステムにはOOが向くので、
そこに関数型を部分的に適用するほうが使いやすいと考えました。


2.どのようなシステムで関数型プログラミングは生かされやすいと思いますか? 
プログラミング言語の大きな分類として、
手続き型は機械(語)、オブジェクト指向型は自然言語(人間)、関数型は人工言語(数学)に、
それぞれ立場が近い言語だと、個人的には考えています。

たとえばCは中水準言語と呼ばれるように、機械に近いのでシンプルで早い。
オブジェクト指向は、人間の社会や言葉を(そのまま直接ではないにしろ)モデリングできる。


関数型は、数学的な問題が対象だとパワーを引き出せます。
じっさい、金融の分野で業務に採用されている事例があるようです。

また並列計算をする場合、副作用が干渉しない関数型が向きます。
(昔に関数型が流行った時期にも、並列計算は使用目的のひとつだったようです)


3.処理をがっつり書く(MVCだったら、モデルに該当する部分)のには向いていないのでしょうか? 
むしろモデルが一番向いていると思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/06 07:59

     ともかく、使いやすいです。本格的な論文を書くより散文を書き散らかすような容易さがあります。たとえれば、大洋に大陸を作るよりも、思いつくままに小島を作って相互に呼び合うようにする方が楽だからです。年取る(現在73歳)と、根気がなくなるので、この散文的プログラミング方法ばかり使っています。
     言語としてはLispを使っています。思いついたときにすぐ使えるのはemacs lispですが、必要に応じてemacsのCommon Lispモードにしています。少しまともなプログラムにするときは、このemacsでのプログラムをFranz Common LispにしてグラフィックスのCLXやCで書いたデバイスドライバなどを呼び出します。
     Franz Common Lispは無料のサービス版で十分間に合います。FORTRANから始まりいろいろな言語を使ってきましたが、半世紀以上付き合えた言語はLispです。老後のためにLispに親しんでおくと良いと思います。

    キャンセル

-3

関数型プログラミングって一時騒がれた割にはあまり使われてないのかな?

言語を選ぶ理由は多くの場合「過去の資産」か「プラットフォーム」のため、良い言語であってもなかなか採用されることはありません。


1.プログラム言語を選定するときに、関数型プログラミングを採用したい(したくない)と判断した材料ってどんなものがありましたか? 

採用しないと判断するのは上記の理由によるものです。

逆に関数型プログラミング言語を採用するとしたら以下の条件を満たした場合になります

  • その言語が得意(あるいは今から勉強しようとしている)
  • 過去の資産が不要
  • 実行するのはWebアプリのサーバーか、デスクトップアプリケーションか、シェルスクリプトみたいに書き捨てて良いもの
  • 他の人が保守する可能性が無い


2.どのようなシステムで関数型プログラミングは生かされやすいと思いますか? 

関数型プログラミングの特徴として以下の2つが挙げられると思います。
1. 高階関数
2. イミュータビリティ

今どき高階関数はほとんどの言語で使えるので、イミュータビリティをどこで活かしやすいかという質問になると思いますが、
私の経験だとゲームAIのような状態を書き換えずに探索したいような場合にコードが書きやすかった覚えがアリます。

(Haskellのような言語では「型チェック」が極めて協力なのでバグを極力無くしたい場合には有効だと思いますが、これはHaskellの特徴であって関数型プログラミングの特徴ではないので)

3.処理をがっつり書く(MVCだったら、モデルに該当する部分)のには向いていないのでしょうか? 

MVCのどこに一番向いていないかと言われたらモデルだと思います。
それは基本的に状態を保持するのはモデルでコントローラーとビューは状態を保持しない単なる関数として振る舞うことがやりやすいためです。
とは言っても大抵の関数型言語にWebフレームワークがありますし問題は無いでしょう。



投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • 関数型プログラミング

    28questions

    関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。