第一言語として機能


回答:


16

大きな問題の1つは、Haskellのような言語で開始した場合、他のすべてが標準以下に見えることです。

正直なところ、Haskellやスキームのような言語から始めることは素晴らしいアイデアだと思います。

(私は関数型言語中毒だと認めています)編集:

私は両方の言語について私が好きなものをOK:

Schemeは非常にシンプルな言語を使用し、開発用に非常に堅牢な言語を構築します。また、SICPはスキームについて書かれており、そこで学ぶ価値があります。Schemeは、あなたが想像できる最も簡単なものであり、完全な言語になる可能性があります。

Haskell で本当に成長しているのは、型システムです。他の言語で見られるバグの多くは、どこかで誤ったタイプが表示されるためです。Haskellでは、ほとんど不可能です。また、怠zyな言語のアイデアには、いくつかのクールなものが含まれています。たとえば、Haskellで無限のデータ構造を作成し、必要な部分のみを作成できます。


公平を期すために、多くの言語にはますます機能的な側面が組み込まれているため、生活は以前ほど悪くはありません。
ティコンジャービス

確かに、これは何もなく、良いことではありませんFPを愛する誰かのために
ザカリーK

3
FPを最初学習する正当な理由としてこれを提案しています。それはしばらくの間、私を本当に幸せにしている傾向です。
ティコンジャービス

しかし、質問に答えるのに本当に多くを言っていません- なぜあなたはHaskell(またはScheme)が好きですか?彼らは学習のための第一言語として良いでしょうか?どうして?
-jimwise

両方の言語に関するコメントを追加
ザカリーK

6

OOP言語を学習する前に関数型言語を学習することの最大の利点は、プログラミングスキルが最初に発達し、その後OOPの概念を簡単に把握できることです。OOP言語から始めた場合、「コードについて考える」と「OODについて考える」という2つのことを同時に学ぶ必要があります。気が散ることがあります。最初に関数型言語で練習し、プログラミングスキルを磨きます。次に、OOPやその他のパラダイムを学びます。OOPは構造プログラミングの不足を補うように設計されていたため、理由を理解しやすくなります。これが、CSコースがCで始まり、C ++に進む理由です。


1
私の大学では、最初に関数型言語である標準MLから始め、副作用とは何かを学びました。その後、Cを学習しましたが、C ++を学習したことはありません。
ジョナス

@ジョナス。国/大学によってコースの構造が大きく異なると思います。私の大学では、Cに続いてC ++がComuter Science Enggコースの標準ですが、他のエンジニアリングストリームではCのみが教えられています。
DPD

私の大学ではJavaから始め、その後はコースに適した言語を使用します。たとえば、C / C ++は、UIのためのC#プログラミングシステムのために使用されているコンピュータの組織のための様々なアセンブリ言語と私はあなたがゲームをプログラミングするための好きだと思う
カーソンマイヤーズ

私の大学では、Scheme(SICPを使用)の学習から始めました。最初の数週間は完全に機能していました。OOPはコースに十分に導入されました。私はそれがすべて非常にうまくレイアウトされ、むしろコースが好きだと思った。
ティコンジャービス

6

関数型プログラミングから始めてプログラミングを学習する方法の問題について、2つの古典的な推奨事項:

  • 最初の明白なものは、AbelsonとSussmanによる古典的なコンピュータープログラムの構造と解釈であり、CSの優れた紹介の1つであり、Schemeを使用して機能的な観点から教えられています。それはだ、完全なオンラインで利用できます。ここから開始しない場合は、いくつかのポイントとしてここに到達する必要があります。

  • より穏やかなペースで同じ分野の大部分をカバーし、ソフトウェアエンジニアリングに重点を置いた最新のテキストは、Matthew FelleisenとRacketのラケット方言を使用するRackt / PLTチームの他の人によるプログラムの設計方法です。スキーム。それはだもオンラインで入手進行中であるとして、第二版は。この本には、DrRacketプログラミング環境で使用するように設計されているという利点があります。これにより、初心者でもエキスパートでもコードを試すことができる非常に使いやすいインターフェイスが提供されます。

なぜ関数型プログラミングから始めるのという質問については、ボブ・ハーパーのブログを紹介したいと思います。カーネギー・メロンは最近、関数型プログラミングを最初に教えるためにCSカリキュラムを刷新し、Harperは彼のブログで彼らの進歩を一気にカバーしています。Standard MLの定義の背後にいる人物の1人として、彼がこの動きに賛成していることは明らかであり、その理由をよく主張しています。

最後に、Haskellを最初に学習することには注意しますが、他の人も同意しない場合があります。HaskellのFPへの純粋なアプローチは確かに良い習慣を生み出しますが、遅延計算に焦点を当てた言語は必ずしも初心者には適していません。プログラマーとして最初に行う必要のある最も重要なことの1つは、ソースを見てプログラムが何をしているのか、同じ問題に対するさまざまなアプローチの相対的なコストについて推論することです。Haskellの怠lazさにより、これらのアクティビティの両方が、経験豊富なプログラマーにとっても多少の挑戦となることは私の経験ですが、Your Mileage May Varyは異なります。


5

FPで開始することの主な利点(または不利点)は、ほとんどの概念を命令型プログラミングにも適用できることです。 Realm of Racketは、ビデオゲームの類推を使用して、機能と命令の両方の概念を教えます。熱心な学生には、機能ゲーム(npi)だけでなく、条件、再帰、ループ、ADT、およびイベント駆動型設計の確実な理解が残されています。これらの概念は、現代のプログラミングでは事実上ユビキタスであり、常に使用されています。

さらに重要なのは、高次関数とデータ型を使用して、FPが優れている抽象化をエンコードする方法を学習することです。 どのようにプログラムを設計するかは、誘導を通して教えることにより、これに対してユニークなアプローチを取ります。たとえばfold、リストの合計と積の両方を取得するコードを見て、共通点を見つけ、実装自体を導出することにより、学生はどのように機能するかを学びます。

上記と同等のOOPには、インターフェース、抽象クラス、ジェネリック、ファンクター、または(間違っている場合)シングルトンの1つ以上が含まれる可能性があります。これらはJavaで完全に受け入れられる設計パターンですが、IMHOは入門的なカリキュラムに属しておらず、基礎となる原則を難読化するだけです。FP言語を「後期」に紹介された人でさえ、強力な機能アンカーを持つことで、絶え間なく変化するOOPの海をナビゲートすることが非常に簡単になったと言えます。


ほとんど忘れていました:Realm of Racketを購入する場合は、次のクーポンを試してください:RACKETEERS。期限がいつ切れるかはわかりませんが、ごめんなさい。
バグ

高階関数に言及するための+1-私はそれらについての独自の答えを投稿する準備ができていました。私の同僚の半分はこの概念に苦労しており、それを手に入れた残りの人たちは、それが最も簡単な解決策になるとは考えていません。
イズカタ

1
ラケットの領域について聞いたことがありませんでしたが、タイトルからそれが何であるかがすぐにわかりました。タイトルはその兄であるLand of Lispへの参照であるためです。
メイガス

4

関数型プログラミングは物事をずっと簡単にします。OOP言語では、複数のスレッドにわたる状態の管理を、その状態を損なわずに処理する必要があります。関数型言語では、行われている作業の大部分が純粋な関数によって行われている場合、それについて心配する必要はありません。

速度/パフォーマンスの点では、私は本当のパフォーマンスジョッキーではありませんが、機能的であることは遅くなることを意味するものではなく、関数型言語の構造はスピードとはほとんど関係ありません。ClojureとHaskellの違いなど、関数型言語の構文は大きく異なります。Clojureは現状のままで非常に高速であり、事後最適化によりJavaの速度に達することがあります(時にはそれを超えることもあります)。

それは本当にあなたが探しているものに依存します


2

プログラミング言語を学習する際には、学習教材、いくつかの優れたコードサンプル、およびメンターの可用性が非常に重要だと思います。あなたの状況によっては、あなたに教えることができる指導者などがいるかもしれませんが、関数型言語のリソースは主流の言語に比べて非常に少ないと思います。これは、主流の言語を学習するのに比べて、進行が遅くなることを意味します。しかし、急いでいない場合、これは問題ではありません。


1
あなたの仮定は間違っていると思います。あります、機能のものについての良いチュートリアル、書籍、論文など。さらに、型システム、実装、仮想マシン、ラムダ計算などの特別なことを扱った論文がたくさんあります。
インゴ

1

おそらく、関数型プログラミング言語の学習を検討する最も重要な理由は、代数的データ型の理解でしょう。メンタルマッピングは、OOクラスの関係のモデリング、さらにはデータベースの設計にも役立ちます。

マルチコア/マルチプロセッサシステムへの焦点は、FPでより明確かつ簡潔に表現できる並列アルゴリズムの使用に重点を置いています。言語のラムダ部門では、今後1〜20年で使用が大幅に増加する可能性があります。

しかし、いくつかの一般的な落とし穴もあります。ラムダ計算、特に遅延評価をサポートする言語では、空間と時間の複雑さの計算と停止の証明の提供がはるかに困難になるため、FPがより単純であると考えることは大きな間違いです。

それで、両方を学んでください!または、おそらくより良い方法:最初にScalaなど、両方を含む言語を学びます。タイダイTシャツとわずかなオランダ語のアクセントを気にしない場合は、MSDNにあるエリック・メイジャー博士によるFPレクチャーが役立つでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.