関数型プログラミング言語の選択[終了]


48

私は最近、関数型プログラミング言語に関する多くのスレッドを読みました(実際、ほぼ1年で)。私は本当に一つを選んで徹底的に学びたいです。

最後の[コース]セメスター、私はSchemeを紹介されました。私はそれが好きだった。シンタックスの非常にシンプルさ、ホモイコニシティの原理、マクロ(衛生的および非衛生的)、手続きのn-アリティなどが大好きでした

Schemeの問題はアカデミックな言語です。実稼働環境で実際に使用されるとは思わない。履歴書を持っていることが特に良いとは思いません。だから、私は代替手段を探していました。それらの多くがあり、それらはどういうわけかすべての人気の同様のレベルを持っているようです。

私がまだ検討した他のいくつかの関数型言語についての考え:

  • Clojure:Javaの世界にアクセスできるため、素晴らしいサウンドに聞こえます。拡張性と同時実行性を指​​向していますが、Javaの世界は今、最先端にありませんか?私はすでにJavaをかなりよく知っていますが、JVMに依存してさらにエネルギーを追加するのが賢明でしょうか?
  • Haskell:非常に高く評価されている言語のように見えますが、私が読んだことから、それはまたアカデミックな言語でもあります。
  • Lisp:それは永遠に続いています。私がSchemeから気に入っているもののほとんどを持っているようです。大きなコミュニティがあります。私が知っていることは、おそらく業界で最も広く使用されている関数型プログラミング言語でしょうか?
  • F#:本当に考慮しなかった。私はMSのものの大ファンではありません。私は彼らのソフトウェアにお金を払う余裕がありません(大学の提携から自由にすることはできますが、私はコミュニティ主導のソリューションを使いたいと思っています)。とはいえ、それは最高のキャリア志向の選択だと思います。

今夜、私はLispに傾いています。1週間前、Haskellでした。それ以前はClojureでした。過去1年間、私はあなたが知っている理由のためにそれをプッシュするのではなく、楽しみのためにいくつかのスキームをしていました。今、私は真剣になりたい(1つを学ぶこと、それを使って実際のプロジェクトを行うこと、最終的には専門的に作業することについて)。私の問題は、いずれかを選択する前に、それらをすべて徹底的に学ぶ必要があることです。


5
何を選んでも、その中の何かに使用するコードをたくさん書いてください。

8
Scalaについて考えませんでしたか?
ykombinator

@ykombinator:聞いたことがあるが、それ以上検索していない。私がリストしたものよりも提供するものがあるかどうか、あるいはそれらのそれぞれから興味深いオプションの組み合わせをもたらすかどうかはわかりません...わかりません。私には非常に控えめな言語のように聞こえますが、人気が高まっているようです。
ジョアニス

1
Javaの世界が「最前線」にあると聞いた場所はわかりません。現在は、主にa)OpenJDKが標準実装になっているb)ScalaやClojureなどの新しいJVM言語とc)ビッグデータ/クラウドプロジェクトがターゲットプラットフォームとしてJVMを選択し、d)Androidを選択しているという事実。2012年初頭の時点では、おそらく最もエキサイティングなプラットフォームの1つです
。....-mikera

1
@mikera:同意した。これは1年以上前のことで、OracleがSun Microsystemsを買収した直後であり、Javaの制御が、より支配的な企業が制御を奪うことによって危うくなることを心配し推測していました...幸運なことに、JVMは現時点ではかなり安全です!
ジョアニス

回答:


35

実用的な  言語が必要ため:

代替テキスト

最近、ClojureとF#に関心が寄せられていますが、HaskellとLispは他の産業よりも多く使用されています。

しかし、Schemeをミックスに追加するとどうなるか見てみましょう。

代替テキスト

うーん、今はアカデミックな言語にあまり似ていないのですか?

実際、上のグラフはおそらく嘘です。「スキーム」という言葉は、プログラミング言語以外の他のコンテキストでの広告募集に役立つ場合があります。:)

そのため、おそらく(もう少し)より代表的な別のグラフを次に示します。

代替テキスト

Schemeの非常に簡単な方言を調べたい場合は、Racketをご覧ください。


うわー、素敵な投稿。ラケットはまさに私が使用しているものです... PLT-Schemeは、私がそれを学び始めたときの名前でした。最後のグラフィックの赤い線は私を困らせます。Schemeがこれほど使用できるとは考えていませんでした。そして、Clojureは確実に離陸しているようです。うーん...
ジョアニス

@M。Joanis:最後の2つのグラフを一粒の塩で取ります。最後のグラフの階段状の外観とボラティリティは、グラフに多くのデータポイントがないことを示唆していますが、誰かが言語にお金を払う価値があると考えていることを示しています。
ロバートハーベイ

@Robert Harvey、2番目のグラフから3番目のグラフに何が変わったのですか?
systemovich

@Geoffrey:キャプションを見てください。「developer」という単語を検索語に追加しました。
ロバートハーベイ

HaskellとLispも同音異義語であり、Indeedのデータは他の世界に一般化されていないことに注意してください。ITJobsWatchには、79個のScalaジョブ、55個のF#、47個のHaskell、30個のLisp、7個のClojureジョブがリストされています。
ジョンハロップ

17

関数型プログラミングを学習したい場合は、最初にHaskellを学習し、それから希望する言語を使用する方が良いかもしれません。他の言語を使用して関数型プログラミングを学ぶことはできますが、それでも命令型のオブジェクト指向コードを使用できます。Haskellで実際のプログラムを作成すると、他のパラダイムを使用してフォールバックすることができないため、関数型プログラミングをより速く学習できます。

Haskellプログラムを書いたら、モナドのようなツールと、ポイントフリーコーディングのようなテクニックを使用して、選択した言語を実現できます。コンセプトは特にSchemeにうまくマッピングされているようです。


最初に純粋な関数型言語を選択するのは正しいと思います。関数型言語の純度による順序付けに非常に興味があります。
ジョアニス

@M。Joanis:あなたの質問にリストされている言語のうち、Haskellが最も純粋で、Clojure、F#、Lispがそれに続くと言います。
ラリーコールマン

15

実際、Schemeでかなり複雑なシステムを実装できたなら、おそらくあなたが働きたいと思う会社でかなり望ましいでしょう。私のキャリアの早い段階で、Schemeでかなりの量の作業を行った学生に出くわしましたが、唯一不利だったのは、作業を説明できないか、基本データを実装するのに十分に理解していない場合でした合理的な時間内の構造とアルゴリズム。私は常に候補者に彼らの好みの言語でそのような質問に答えさせます。私は、リンクリストに要素を追加するなど、簡単にするべきものにかなり苦労することに成功したSchemeで最高だと思っていた人に出くわしました。

しかし、平均的なWebアプリを作成するのに十分なだけSchemeを「取得」できれば、それはほとんどの深刻なソフトウェア会社でかなり良いセールスポイントになるでしょう。

"blub"ショップでインタビューを行っていて、Scheme、Haskell、F#に習熟しているために開発者がおかしいと思った場合、おそらくそこで働きたくないでしょう。ほとんどの場合、有能な開発者がギグを選択するため、将来的に想像できる唯一のオプションが企業である場合を除き、「実用性」を気にしないでください。有能で柔軟性があり、問題を打破することに取り組みます。

大学は実用性についてではありません。それは、探検して学ぶための安全な環境を作ることです。それは実際、あなたが残りのキャリアのために普通のソフトウェアを書くことになっても、有用です。

そうは言っても、すぐにこれらの選択肢の1つだけに制限したい理由はわかりません。約4週間で4つの言語すべてを簡単に理解し、現在の気まぐれに最適なメッシュを選択できます。次に、別のオプションに戻って、同様のものを実装してみてください。さらに複雑なものに進み、オプションをもう一度検討してください。実験は良いです。来月生計を立てているのでなければ、まだ専門家になる必要はありません。

私はScheme、F#、Emacs Lisp、Common Lispでいくつか書いており、少なくともここ数年は少なくとも時々Haskellを少し読んでいます。私はそれらの専門家であるとは言えませんが、これらの言語への遠足は、私が専門的に仕事をしている他のすべての言語(C#、Java、Ruby、時にはBoo、Perl、Python)で私に利益をもたらしました。好奇心は、他の何よりも、より永続的で充実したキャリアを構築します。


2
「好奇心は、他の何よりも、より永続的で充実したキャリアを構築します。」この声明は非常に刺激的です。あなたが正しい。私は急いでいます。習うのに時間がかかりすぎるといつも感じています... 12年前に戻って、始めたときは、VBとC ++に時間を無駄にしないようにします。私はこれらの年がかなりひどく浪費されたように感じます。気になりませんでした。ものをコーディングしたかった。私が知っている言語を使用すれば十分でした。その時、私はかなりの量を知っていると思ったが、それはそんなに恐ろしいことではなかった。
ジョアニス

10

私はしばらくの間Haskellに飛び込みましたが、私が思いついた結論は、少しアカデミックすぎるということでした。実用的なことをするのはとても大変でした。純粋な関数型言語では、IOのようなものはモデルにまったく適合しないため、モナドに対処する必要があります。私は、やっとのことで能力を発揮するために途方もない時間を費やす必要があると判断したので、次に進みました。

私は大学でSchemeをしました。些細なことのように聞こえるかもしれませんが、すべてのかっこは本当に気を散らし/イライラさせます。Pythonのような言語を使用した後、それに戻るのは困難です。

最近、F#を調査しています。機能的ですが、必要に応じて命令型でオブジェクト指向にすることもできます。これにより、任意の.NETライブラリを使用できるとともに、純粋な機能部分をGUI、IO、ネットワークなどのより実用的なものと簡単に混在させることができます。F#のスタンドアロンバージョンを入手できます。

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=effc5bc4-c3df-4172-ad1c-bc62935861c5&displaylang=en


F#とClojureが純粋に機能的ではないという事実は、彼らにとって有利な重要な役割を果たします。たぶん、F#が...ネットの家族のいつかの私のエントリポイントかもしれない
Joanis

1
@MJoanis、あなたはコストをF#に対するポイントとして述べましたが、エリックが指摘するように、あなたはそれを完全に無料で手に入れることができます。
ベンジョー

条件を正しく読んだ場合、基本的には使用しない(またはライセンスを購入する)条件で無料で入手できます。しかし、私がVisual Studioを使用している会社で仕事をすることになった場合、学ぶことが非常に良いことであると理解しています。より自由な関数型プログラミング言語で機能したら、おそらく試してみるでしょう。
ジョアニス

1
@M。Joanis:いいえ、F#はオープンソースです。他のプラットフォームのMonoで実行してみることができます。
ジョンハロップ

2010年以降は時が変わったのかもしれませんが、ここ数か月でhaskellを学び始めた人として、haskellでIOを行うことはまったく難しいとは思いません。基本的な事柄については、新しい構文を学ぶ必要があるだけです。本当の基本的な理解を得るには数週間かかりますが、モナドについての曖昧さは本当にわかりません。OOPのクラス、インスタンス、静的メンバー、およびその他のすべての状態関連のジャズよりも学習が難しいとは思いません。
サラ

9

実用的で汎用的な関数型プログラミング言語を望んでいるという観点から、1年または2年前にすべての主要な関数型言語を評価しました。

最終的にClojureを選択しましたが、これは後に優れた選択肢であることが証明されました。

大まかに言って、主な理由は次のとおりです。

  • ライブラリエコシステム -言語が役立つためには、優れたライブラリにアクセスする必要があります。JVM上にあるということは、最大のオープンソースライブラリとツールエコシステムに簡単にアクセスできることを意味するため、JVM言語に移行することは実用的な観点から考えると簡単です。ここでもScalaが高得点を獲得しました。

  • マクロメタプログラミング-Lispのこの側面は、特にかなりの量のコード生成を行うと予想されていたので、私にとって常に魅力的でした。ポール・グラハムの小論文「Beating The Averages」でなされた議論を非常に高く評価しました。ここでは、さまざまなLispがすべて強く得点しました。

  • パフォーマンスは「十分」でした-Clojureは常にコンパイルされ、JVM JITオプティマイザーと優れたGCのメリットを享受します。いつものように、関数型言語の使用にはいくらかのオーバーヘッドがありますが、Clojureを使用すると、少しの労力でJavaの速度に近づくことができることが明らかになりました(Clojureは、Javaプリミティブと、必要な状況でオプションの静的型付けをサポートします)。私の推定では、Clojureは、最適化されたJavaまたはC ++コードで達成できるものよりも2〜5倍遅いと考えられます。これは、欠陥のあるベンチマークで見られるものと一致します。また、特にパフォーマンスに敏感なコードを純粋なJavaで記述し、Clojureから呼び出すだけで十分です。

  • 同時実行性 -Clojureには、特に高度なマルチコア同時実行性に対して、同時実行性に対する非常にユニークで強力なアプローチがあります。説明するのは少し難しいですが、このビデオは原理を味わうのに最適です。現在、Clojureは、「関数型プログラミング言語で共有状態、並行状態、および可変状​​態をどのように管理すべきか」という難しい質問に対する最良の答えを持っていると思います。

  • 言語設計 -ClojureはIMOの非常によく考え抜かれた言語設計です。例としては、通常のLisp括弧に加えてベクター[]およびマップ{}リテラルを使用し、不変の永続データ構造を使用し、シーケンス抽象化により言語全体で怠programmerをサポートし、さまざまな問題を解決するためのさまざまな直交機能をプログラマーに提供します。抽象化単純化が容易になった芸術をご覧ください。

  • コミュニティ -常に主観的ですが、Clojureコミュニティで見たものが好きでした。態度は非常に役に立ち、建設的で実用的でした。多くのClojureの人々(リッチヒッキー自身を含む)が複雑なエンタープライズシステムを構築した背景から来ているという事実を反映している可能性があります。ClojureコミュニティーがJavaコミュニティーにも強力にリンクしているという事実は、Clojureが「ニッチ」に陥るリスクを負わないことを私に確信させるうえで重要でした。

Clojureのいくつかの小さな欠点を挙げなければならない場合、これらは次のようになります。

  • 動的型付け -多くの場合、これは生産性の点で有利ですが、平均的には、より強力な型チェックと推論と引き換えになると思います。ほとんどの場合、これは優れた自動化されたテストスイートによって軽減されますが、コンパイラーによって静的に検証される型が好きな場合は、HaskellまたはScalaがお勧めです。

  • 最先端 -Clojureは非常に高速に開発されており、多くのイノベーションが進行しています-これの欠点は、多くの実験があり、いくつかのライブラリとツールがまだ未熟であり、Clojureのメジャーバージョン間に時々変更が加えられることです監視する必要があります。

全体的に、優れた実用的な現代の関数型言語が必要な場合、Clojureを間違えることはないと思います!


1
ありがとう!素晴らしい投稿!最近は、木と再帰性に大きく基づく社内プロジェクトに使用することを検討していました。さらに、ここにはかなり多くのJavaコードがあり、Clojureで再利用できます。
ジョアニス

6

あなたは宿題をしたように見えるので、おそらくすでにこれを知っていますが、SchemeはCommon Lispと同じようにLispの方言です。Schemeについて多くのことを好むが、その学問的な性質が気に入らない場合は、Common Lispを試してください。TIOBEインデックスによると、26位のSchemeに対して13番目に人気のある言語です。

あなたが言及した言語のいくつかは、最近見た仕事の説明に表示されますが、それは私の小さなサンプルセットかもしれません。私は仕事で直接その言語を使用することを期待していませんが、私は個人的にHaskellを学びます。関数型プログラミングの概念は、言語自体の直接的な市場性よりも、将来のプログラム設計にとって私にとってより価値があります。


TIOBEリンクをお寄せいただきありがとうございます。これは興味深いリファレンスです。関数型プログラミングの観点から純度の高いHaskellを選択していると思いますか?
ジョアニス

1
@ M.Joanis:かなり後のことですが、後でLispを手に入れることも考えています。Programmers.stackexchange.com/questions/18838/…を
Zeke

選択した答えは非常に理にかなっています。私は、機能的なパラダイムのすべてを本当に理解するまで、純度が道のりのようです。
ジョアニス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.