14

これが状況です:私は主にC#をプログラムし、失いたくない型を書いています。同時に、関数型プログラミングを学びたいと思っています。もちろん、明白な答えは F# です。

しかし、C# 以外はすべて emacs をエディターとして使用しており、Lisp も学びたいと思っています。(あなたが知っているエディター/IDE の言語を学んでください。そのため、私は VS マクロを書くための VB を少し知っています) そして、それは emacs だけではありません。Lisp は私が本当に学びたいものです。

F# に関しては、相互運用性の問題なしに C# と組み合わせることができ、優れた GUI (WPF) とその他の多くの .NET 機能を備えています。しかしもちろん、Lisp ほど成熟していません。

私が現実的に考えると、関数型言語を自分の職業生活に密輸したいのであれば、それは F# でなければならないことはわかっています。2 つの言語全体を学習するのは少し大変に思えるので、Lisp が関数型プログラミングを学習する優れた方法になることを期待していました。後で F# を始めれば、とても簡単になるでしょう....

これは本当ですか?それとも、2 つの言語はまったく比較できないのでしょうか。

4

9 に答える 9

15

Lisp は言語と実装の大きなファミリーです。たとえば、Scheme は Lisp の方言で、おそらく 100 以上の実装があります (そのうちの約 10 はやや人気があります)。Common Lisp は、現在約 10 の実装が維持されている別の方言です。Scheme と Common Lisp はどちらも、実装が実装しようとする標準を記述しています。

F# は言語と実装の両方です。マイクロソフトから。主に OCAML から派生したもので、ML 言語のファミリーに属しています。

Lisp は、関数型プログラミングをサポートする非常に初期の言語でした (60 年代の Lisp 1.5)。関数型プログラミングの初期の実験の多くは、Lisp で行われました。70 年代の Lisp コミュニティでは、関数型プログラミングのルーツへの動きがあり、その結果がSchemeでした。その後、特に前世紀の 80 年代と 90 年代に新しい関数型言語 (ML、Miranda、FP、SML、Haskell、Clean など) が登場しましたが、これらは通常の Lisp 方言とはまったく異なります。まだいくつかの遺産がありますが、ほとんどは異なる方向に発展しました (静的型付け、型推論、モジュール システム、バッチ言語、代数データ型、遅延評価、純粋性など)。Scheme コミュニティには、FP コミュニティとのつながりがまだたくさんあります。しかし、それはほとんどそれです。

特定の FP 言語から独立して学習できる基本的な FP のアイデアがいくつかありますが、一般的に F# はほとんどの Lisp 方言とは大きく異なります。F# が .net エコシステムをサポートするというもう 1 つの機能 (特に Microsoft が作成したものであるため) は、Lisp 方言ではあまりサポートされていません。

また、F# を学習するために Emacs Lisp のような制限付き Lisp の方言を知っていても、あまりメリットはないと思います。

于 2009-06-23T19:16:49.760 に答える
10

Common Lisp と F# で学んだことには、わずかな「重複」しかないと思います。共通点はざっくりと思います

  • 共通の基本データ型として「cons-lists」を使用してプログラミングし、ループではなく再帰的 (特に末尾再帰的) 関数を記述することがある
  • 一般的な高階関数の基本的な使い方 (例: 'map' - リスト内のすべての値に関数を適用)

非常にコアな関数型プログラミングのいくつかを除けば、Common Lisp と F# は、2 つの主流の「関数型」(非 Haskell) 言語と同じくらい離れていると思います。Common Lisp は動的です。F# は静的に型指定されています。構文形式は完全に異なります。実行時間は完全に異なります。ライブラリは大きく異なります。オブジェクトシステムは完全に異なります。

どちらの順序で学習するかに関係なく、一方を学習した後、もう一方を学習することはまだかなりあると思います (上で説明した小さなオーバーラップを法として)。

于 2009-06-23T18:16:34.813 に答える
5

F#は、SMLやCAMLなどのMLファミリーの言語に最も匹敵します。構文と機能はLispとは異なります。

しかし、コンピュータサイエンスの観点からは、少なくとも1つの関数型言語を学ぶことが非常に重要だと思います。そのように考えることができるのは良いことです。

そして、F#を開始する前に、より純粋に関数型の言語を学ぶことは、優れた関数型プログラミングの習慣を身に付ける方法になると思います。そうしないと、F#コードがよりOOになり、機能が低下する可能性があるためです。あなたはから来ています。

于 2009-06-23T16:22:27.783 に答える
5

私の見解では、関数型プログラミングの学習には 2 つのアプローチがあります。

  1. Scheme (Lisp) や Haskell などのより純粋な関数型言語を使用すると、手続き型の考え方からすぐに抜け出すことができます。また

  2. F# のような実用的な関数型言語を使用してください。この言語は、より使い慣れた機能的ではない構造を提供し、簡単に理解できるようにします。

どちらの場合でも、その言語で何か役に立つことができれば、学習経験からより多くを得ることができます. あなたは Lisp (Emacs) と F# (.NET 相互運用) に興味を持っているようですね。そのため、両方を調べて、何があなたの注意を引くのか見てみたいと思います。

最終的には、関数型プログラミングの概念 (高階関数、副作用なし、末尾再帰など) を理解することは、どの言語よりも価値があります。そして、これらの概念を一度学べば、新しい言語を習得し、その手法を他の言語に適用することがはるかに容易になります (ますます機能的な C# など)。これらの線に沿って、現実世界の関数型プログラミングに興味があるかもしれません。

于 2009-06-23T18:09:46.370 に答える
3

考慮すべき重要な点は次の 2 つです。

  • LISP は動的に型付けされますが、F# は静的に型付けされます。
  • LISP にはマクロが組み込まれていますが、F# には組み込まれていません。

どちらも機能的であると考えられており、多くの共通機能を共有していますが、異なるものでもあります。LISP を学べば確実に F# プログラマーとしての能力が向上し、その逆も同様です。

.NET と相互運用できるようにするために、私は確かに F# を選択しますが、プログラミングの美しさのために、LISP も試してみます。

于 2009-06-23T17:40:58.863 に答える
2

これらは両方とも関数型言語ですが、構文的には非常に異なります。つまり、多くの概念は類似しており、(手続き型開発者として)どちらかを使用するには同じ心を曲げる必要がありますが、それらは非常に異なる言語です。

F#はMLの派生物(すべての派生物とともに、不純な関数型言語と見なされます)ですが、 Lispは古く、「純粋な」関数型言語と見なされます。

関数型言語の純度は魅力的なトピックです。概念をよりよく理解するために、言語の純度とダーティおよびクリーン関数を読むことをお勧めします。

多くの人が「純粋」関数型言語について話しますが、「純粋」は「良い」の同義語のようです。純粋な関数型言語の定義に一般的に関連する2つの特性があります。

  1. 関数は副作用を持つことはできません
  2. 任意の引数を指定して呼び出された関数は、常に同じ値を返します。
于 2009-06-23T16:16:15.533 に答える
2

私は F# の初心者ですが、F# の前に Lisp を勉強しました。Lisp は、.NET フレームワークとプログラミング言語の範囲の両方で F# をコンテキスト化するのに非常に役立つと信じています。

ここで少なくとも最初のいくつかのビデオを見ることを心からお勧めします。

http://groups.csail.mit.edu/mac/classes/6.001/abelson-sussman-lectures/

これらは、最初の 1 時間以内に Lisp の基本を教えてくれます。シリーズはその知識に基づいて構築され、そこから生まれる刺激的な原則を浸透させます。

于 2009-06-30T12:13:49.673 に答える
1

F# と Scheme のセマンティクスは、厳密な型指定を除いて非常によく似ています。

また、Scheme は非常に小さいため、学習する必要はありません。

于 2009-06-30T12:24:18.467 に答える
0

プログラミング言語として、Lisp はそれ自体が非常に特殊ですが、関数型プログラミングをサポートしていることを除けば、F# とはまったく似ていません。Lisp から F# に引き継がれる言語構造は多くありません。Lisp を学びたい場合は、それを行ってください。関数型プログラミングの考え方は、構文ではなく引き継がれます。Lisp は本当に古く、50 代後半です。多くの言語がその影響を受けており、多くの方言が存在します。

F# の前に学ぶための純粋な関数型言語を探しているだけなら、Haskell をお勧めします。Haskell は ML の影響を強く受けており、F# は ML の派生物であるため、F# への移行に適した言語です。Haskell コードを見ると、F# コードにも同様のパターンが見られます。

于 2009-06-23T16:58:56.433 に答える