関数型プログラミングは数学と強く関係していますか?


21

関数型プログラミングの多くは数学的な概念で描かれているので、関数型プログラミングは数学にとても関連していますか?命令的な背景を持つプログラマーのための関数型プログラミングを学び、理解するための強力な数学の基礎を持つ必要がありますか?


1
この質問は数学で正しくタグ付けされていますか、それとも数学ですか?

ここここに非常によく似た2つの質問があります。私はあなた数学の「強い基盤」を持っている必要はないと思います、何らかの観点からその原理をかなりよく理解する必要があります。ジオメトリはメモリマッピングで最も役立ちますが、数値がこれほど大きくなることはほとんどありません。ただし、数学は非常に便利です(可能です)。
ガレットクラボーン

回答:


28

すべてプログラミングは数学に関連しています。実際、多くの大学はまだコンピュータサイエンスプログラムを数学部の管理下に置いています。

関数型プログラミングの学習に関しては、数学を学習するための強力な基礎を持つ必要はありません。私は今、3つの異なる関数型言語(Haskell、Erlang、Clojure)を適度に習得しており、自分の数学スキルは非常に弱いです。Haskellのコミュニティは、実際、数学に焦点を当てた物事の話し方で少し面倒に感じることがありますが、ErlangとClojureはどちらも非常に実用的な関数型プログラミング言語であり、チュートリアル情報が書かれているので、ピックアップするのはそれほど難しくありません、プログラマ向けであり、ハードコアな数学オタク向けではありません。そうは言っても、数学のハンディキャップにもかかわらず私は Haskellを取り上げたので、不可能ではありません。

宣言型プログラミング言語全般(関数型はサブセットです)を拾い上げる際に見つけた本当の難しさは、制御したいという衝動をあきらめています。コンピューターに何をすべきかを伝えるために。慣れるまでに時間がかかります。


いい言葉、+ 1。
ムダシル

4
SQLをよく学べば、宣言型プログラミングはそれほど難しくありません。

7

はい。基本的に、機能プログラムは次のようなステートメントの集まりです。

// 1_と2_は「ダミー引数」f(1_):= sin(1_)g(1_、2_):= 1_ + 2_など...

x = f()

y = g(x)

z = h(x、h2(y))

等...

プログラムが行うべきことを、以前に定義された値の関数として新しい値(変数ではなく)を定義する方程式の形で書いています。また、関数をリレーションとして定義します。これは数学の定理が書かれている方法と非常によく似ています。


haskellやその他の奇妙な構文よりも数学関数をよく理解できます。数学の手順を関数型言語の構文に関連付けるリンクはありますか。
RainDoctor

この答えは正確です。FPは、段階的な手順ではなく数学関数を記述していることを認識(および内部化)すると、完全な意味を持ち始めます。ほとんどの人は最初に手続き型プログラミングを学びますが、その荷物は膨大です。手続き言語の「関数」は「手続き」と呼ばれるべきだと思います。
カカジ

2

IMO Mathematicaは、関数型プログラミングを使用できる言語の例として、数学の強力なバックグラウンドを必要としません。実際、基本的な数学教育中に関数型プログラミングのようなものに遭遇したとは思いません。私はMathematicaプログラミングをCスタイルで始め、わずか数年後に関数型プログラミングを発見しました。私は基本的な関数型プログラミングコンストラクトは好きではないと思うMapApplyNestList、などすべての任意の数学の背景が必要です。


1

あんまり。関数型プログラミングは単なる方法論ですが、ラムダ計算やそのようなものに基づいていました。

クロージャーは、関数型プログラミングの概念を手続き型言語に導入する(小さな)試みです。代わりにfor(int i =0 ; i < num; i++) doStuff(arr[i]);、代わりに配列の要素が本質的に「それらに行われたもの」を持つことができると仮定することができますarr.each do |el| doStuff(el) end


10
クロージャーではなく、匿名関数を例示しているだけです。ウィキエドピア:The term closure is often mistakenly used to mean anonymous function. This is probably because most languages implementing anonymous functions allow them to form closures and programmers are usually introduced to both concepts at the same time. These are, however, distinct concepts. A closure retains a reference to the environment at the time it was created (for example, to the current value of a local variable in the enclosing scope) while a generic anonymous function need not do this.

1

簡単な答えは、そうです。なぜなら、ある程度の形式化(プログラミング言語など)を持つものはすべて、数学の度合いに応じて数学に強く関係しているからです。

ただし、プログラミング言語を使用する場合、言語の理論的基礎など、数学に厳密に精通している必要はありません。文脈自由言語とは何か、そしてそのような言語がそれを使用するためにどんな法律と財産を持っているかを知る必要はありません。同様に、ドイツ語やフランス語を話すためにドイツ人やローマ人である必要はありません。

「数学的な」表記法は、関数型言語の一般的な特性ではありません。ScalaとすべてのLispベースの言語は、Haskellと比較して非常に異なる構文を持っています。

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