なぜすべての関数型プログラミングのチュートリアルがこんなに充実しているのですか?


20

私は関数型プログラミングを学ぼうとしており、私が見つけたほとんどのチュートリアルでは、より複雑な構造の例として数学を使用しています(場合によっては単純な構造も)。どうしてこれなの?もっと簡単なものが使用できると思います。そのため、学習が難しくなっています。

背景情報:私は12年間ソフトウェアを書いています。クロージャ、ファーストクラスの市民としての機能、ジェネリックなどの概念の一部を理解しています。高度なレベルで高階関数に問題があるかもしれませんが、基本的な理解があると思います。モナドは私を尻に噛みついており、この時点で私はそれを過ぎていない(私はしつこいので、最終的にはそうなると確信している)。


少しだけ、私はあなたが提案した他の3つの言語を試していない
チャールズランバート

F#は、C#を知っている場合に開始する最も簡単な方法です。大きな数学の知識を要求しません。
CND

6
SICPを試してください-それは高校の数学を超えて行き過ぎません。
SKロジック

@Charles Lambert-OfficeSpaceを見ると、Jobのコメントの2番目の部分が表示されます。
ジェッティ

@Charlesランバート:あなたを学びグレートこだわりHaskellはあまりにMathyさんされていません:D
マシューM.

回答:


21

関数型プログラミングは数学的な構造のモデリングが非常に得意であり、数学の概念、特にラムダ計算に非常に関係しているため、彼らは数学を使用します。また、I / Oは通常、さまざまな言語のREPLを介した関数型パラダイム数学の多くの言語でかなり厄介で高度な主題であるため、最初は言語を教える良い方法になります。

関数型プログラミングは、関数をプログラミング言語内のファーストクラスの構成要素として扱うため、関数の生成は非常に重要になります。したがって、特にグラフ理論では、高等数学がかなり重要になります。

命令型言語も同様に価値がありますが、基本的には算術的です。とにかく追加できるマシンに近いためです。抽象度の高い関数型言語は、数学に向いています。アカデミアでの一般的な使用は、多くの数学を知っており、多くの数学を学ぶことを期待している人々に教えている人々によって慣れ、教えられているので、助けにはなりません。したがって、いわば「それを馬鹿にする」ことは可能ですが、これらの要因が与えられる可能性は低いです。

http://learnyouahaskell.com/-おそらく関数型プログラミングの最も穏やかな紹介の1つです。私は再確認しましたが、基本的な代数とグラフ理論以外には何もありません。


learnyousomeerlang.comは、Haskell以外の何かが必要な場合のオプションです。
トラビス

11

多くの理由があり、それらはすべて関連しています。

  • ほとんどの関数型プログラミング言語は、CSが数学と密接にリンクしているアカデミックコンテキストで開発されたため、それらを設計した人々は数学のバックグラウンドが強い(そして聴衆についても同じことを想定する傾向がある)
  • 関数型プログラミングは、特に数学が多い問題を解決するのに適したパラダイムです
  • FPの背後にある理論であるラムダ計算(基本的には関数の抽象的な理論)は数学の分岐であり、FP言語はラムダ計算の概念と用語を使用する傾向があります。

また、FPは他のパラダイムよりも優れているわけではありませんが、重要な概念(実際のファーストクラスの市民としての機能、高次の機能、閉鎖、および純度)には特定の考え方が必要です。ある時点で、あなたの心は「クリック」するはずです。これら4つのコアアイデアを理解すれば、残りは他のパラダイムと同じくらい簡単になるでしょう。


3
学界で開発のための+1:それはので、関数型言語を作成する人は、数学的な性質上、それをベースに漏れた ...
マシューM.

@Matthieu M:数学的な特性に基づいてプログラミング言語を作成すると、正しいソフトウェアを作成し、開発時間を短縮できます。たとえば、Haskellコードのデバッグに費やす時間は、C ++コードよりも間違いなく少ないです。開発時間(およびコスト)を削減することは、いくつかの数学を学ぶ労力を正当化することができる大きな実用上の利点です。tdammerが指摘したように、学習する必要がある概念がいくつかありますが、FPがいくつかのコアアイデアを理解した後、命令型プログラミングと同じくらい直感的です。
ジョルジオ

私はまた、数学的概念を使用して命令型言語を記述することができるというダムに同意します。実際、命令型プログラムの数学的記述は、通常、関数型プログラムの数学的記述よりもはるかに複雑です。IMOこれは、命令型言語がバグを含む可能性が高い理由を説明しています。命令型コードを完全に理解することはより困難です。少なくとも、これは数年の関数型プログラミングと、さらに長年の命令型プログラミングの個人的な経験です。
ジョルジオ

@Giorgio:「言語に漏れる」(どういうわけか)と「チュートリアルに漏れる」には違いがあります。数学をあまり使わずに関数型プログラミングのチュートリアルを書くことができると確信しています。もちろん、それらが良いかどうかは議論の余地があり、おそらく主観的です。
マチューM.

@MatthieuM .:リーク(チュートリアルへの漏えい)の意味を明確にしてくれてありがとう:あなたのコメントは今、私にとってもっと意味があります。FPのチュートリアルにはできるだけ少ない数学を含める必要があることに同意します。私はあなたのコメントを何らかの形で誤解していました。産業界と学界の両方で働いたことがあるので、私は「学界では実際の世界では役に立たない多くの数学を行う」種類のコメントに少し過敏です。コメントとtdammerの回答の両方に対して+1。
ジョルジオ

5

基本的に、コンピュータープログラミングは数学であるためです。関数型言語はこれを念頭に置いて設計されたため、チュートリアルの多くが数学に焦点を合わせているのはこのためです。

コンピュータープログラミングを数学的基礎を持っていると考えることに慣れていない場合、学ぶのは困難です。


4
基本的にコンピューティングは、ロジックと算術の組み合わせです。これは数学ではありません。数式で分岐命令を表現することはできません。したがって、数学に基づくことはできません。関数型プログラミングの群衆は、それが数学に基づいていることを望んでいるので、分岐命令が存在しないかのように動作するプログラム言語を開発します。
ジェームス・アンダーソン

9
@ジェームズ・アンダーソン、あなたは論理と算術は数学ではないと言っていますか?また、分岐命令(通常はスイッチのような形式で表現されます)を含む多数の数式を見てきました。
ピーターテイラー

4
簡単な計算を扱う数学のサブセットの算術。ロジックは、すべての合理的思考の基礎となる数学のスーパーセットです。ちなみに、関数型プログラミングは数学的に表現できる問題を解決するための非常に良いアイデアです。GAP(一般に認められた会計慣行)のようなarbitrary意的なルールの非論理的な混乱を追いかけようとしているときはそれほど暑くありません
ジェームスアンダーソン

6
@ ian31、「根本的に」という言葉をどのように定義しますか?土木工学も物理学と数学に基づいていますが、実際には、人々が使用して楽しむためのものを構築することがすべてです。そして、とにかく、現実世界の問題の解決策のプログラミングについて考える前に、 その問題を数学的形式に変換する必要あります。他の方法では機能しません。プログラミングはすべて形式主義です。
SKロジック

6
@ ian31、プログラミング言語 形式主義です。それらの動作は厳密に定義されており、予測可能です。したがって、特定のモデルをコーディングすると(たとえ曖昧であっても)、ある種の形式主義に変わります。数学は、明確に定義された厳格なモデルの光沢のあるクリスタルクリアな世界に限定されているという一般的な認識にもかかわらず、この曖昧な領域にうまく適合します。
SKロジック

1

「The Little Schemer」は関数型プログラミングの素晴らしい入門書であり、まったく役に立たないと思います。モナドには入らないので、あなたの好みには基本的すぎるかもしれませんが、最後に向かってYコンビネーターの派生を行います。

12年前の大学以来関数型プログラミングを何もしなかった後、最近それを経験しました。それは素晴らしい復習でした。

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