これらの最新のプログラミング言語の事実上のエラーはあなたを苦しめ、なぜ読むのが苦痛なのか

今日、私は記事に出くわしましたこれらの最新のプログラミング言語は、Twitter の怒りの後であなたを苦しめます.投稿はばかげており、実際に私にとっては読むのが苦痛です.しかし、執筆時点で 1,000 を超える拍手が寄せられており、黙っていることはできません.

本質的に、この記事は関数型言語を促進し、その利点を列挙しようとします. 私自身 FP ファンボーイとして、関数型プログラミングの使用を奨励するコンテンツが大好きです.嫌いな言語と宣伝しようとしている言語の両方に対する著者の理解の欠如を示しているだけです。そして、著者が別の悪名高い中程度のクリックベイトであるオブジェクト指向プログラミング - 1 兆ドルの災害の背後にいたことを知っても、私は驚くことではありません。

この記事の意見には焦点を当てません. さまざまなTwitterのたわごと投稿には、この記事よりも極端な意見が含まれている場合があります. また、「悪い」または「めちゃくちゃ」などの流行語を客観的に批判することは困難です. 代わりに、誤解を招く事実に焦点を当てましょう.エラー.ただし、見逃したセクションや経験のない言語には、まだ多くの事実上の誤りがあると確信しています.

純粋関数

純粋な関数は決定論的です 副作用なし .「変更しない」というだけでは、関数を「純粋」にするのに十分ではありません。

驚いたことに、著者は投稿の後半で純粋関数の正しい説明をしており、同様の不一致も複数回発生しているため、記事の大部分が他の場所から「借用」されているのではないかと思いました.

C++

C++ は多くの理由で完璧なパンチ バッグですが、それでも、言語を理解していない場合は、その言語を非難するべきではありません。

RAIIとは何か知っていますか? C++ や Rust を使ったことがありますか?同じ議論が、Rust に GC がないという著者の暴言にも当てはまります。

Bryce Lelbach からのツイートで返信させてください。

C++ では、いいえ 参照は null 可能です 😉.

Java &C#

C# は Java の模倣でした。しかし、これは新しい言語であり、Java の実装を意図したものではありませんでした。

これらはすべて優れた機能ですが、関数型プログラミングの本質となるものはありません。最初の関数型言語である Lisp は、これらの機能をまったくサポートしていません。

Jonathan Frech は、Lisp を関数型言語と見なしていない人がいるという素晴らしいコメントを持っていました。そうは言っても、Standard ML'97 でさえ、おそらく一部の人はより「関数型」と見なしている言語ですが、パイプ演算子はサポートされていません。標準ライブラリには、永続的なデータ構造に対する最小限のサポートしかありません (不変のマップ/辞書型さえありませんでした)。関数型プログラミングの聖杯であるラムダ計算にも、上記の機能はありません。

ところで、C# はパターン マッチングをサポートしています。 1 著者はこの事実を以前に認め、後で忘れているようで、投稿の一部が他の場所から「借用」されているのではないかと私は思いました.

C# は、async/await パラダイムを普及させる言語です。

ただし、null 許容参照のサポートがあり、参照をデフォルトで非 null にすることができます。

Python

「C ファミリー言語」とは一体何を意味するのでしょうか?言語は C に似た構文を共有していますか?そして、Python はどのようにして突然 C ファミリー言語になったのでしょうか?

「解釈された言語」は、明確な定義のないこの分野の一般的なバズワードです。言語自体の代わりに、言語の実装が「解釈される」か「コンパイルされる」かを決定します。 -of-time コンパイラーとツリーウォーク インタープリター、そして最近のほとんどの言語実装はその中間にあります。

通常、Python VM は 100 ミリ秒未満で起動します。

さび

Rust はまた、この記事の「生産性の低さ」に対する多くの不当な怒りに苦しんでおり、正直なところ、この記事の Rust に対するすべての批判は、Google で簡単に検索したように見えます。

そのようなコンテキストがなければ、プログラミング言語の実行時パフォーマンスを比較することはできません.多くのパフォーマンス設計のトレードオフがあり、ある状況でより速く実行される言語が、別の状況ではより遅く実行される可能性があります.

C++ には std::optional があります 2 そして Java には Optional があります 3 .

一部のガベージ コレクターは、メモリ コンパクションと呼ばれるプロセスでメモリを移動します。そのため、たとえば C# も固定をサポートしています。

タイプスクリプト

まったくそうではない4 .

immutable.js と Rambda (著者が言及した Javascript ライブラリ) はどちらも typescript の型定義を提供し、JS で使用する場合と比べて使用が難しくありません。

関数型言語

関数型言語を促進しようとする人として、作者はそれらの言語についてもっとよく知っているべきです。

ハスケル

最も「強力」と見なされる型システムはありません。ちなみに、依存型言語についてはどうですか 4 ?

OCaml

Dune はパッケージ マネージャーではなく、ビルド システムです。多くの場合、オパムと組み合わせて使用​​されます。

Real World OCaml の第 2 版 は最新で、オンラインでも無料で入手できます。

Scala

Scala 標準ライブラリは、不変のデータ構造に対する優れたサポートを提供しますが、ケース クラスはそれらのデータ構造とは何の関係もありません。

エルム

残念ながら、Elm コンパイラは実行時に例外をスローする Javascript コードを生成できます。

カスタム要素があります5 およびポート6 .

React コンポーネントをカスタム要素にすることができます。

Evan は現在も Elm に関する作業を行っており、定期的にコミュニティとやり取りしています。

理由 ML

Reason で Javascript ライブラリを使用するには、ボイラープレート (external) が必要です。 )、Elm と同じです。

React の最初のプロトタイプは、OCaml ではなく標準 ML で作成されました。

エリクサー

わかりました。Haskell や Elm が ML ファミリーに属しているというあなたの意見には賛成できますが (私は同意しません)、動的型付け言語はここで何をしているのですか?

結論

この記事には、純粋関数、代数データ型、パターン マッチング、および FP 言語のエラー処理に関する優れた内容が含まれています。著者が偏見のある、正しくない、誤解を招く内容をすべて削除する場合は、人々が読むことをお勧めします。ただし、著者は別の道を選びます。残念なことに、最近のインターネットは、意味のある内容の投稿ではなく、常にクリックベイトやセンセーショナルな記事に報酬を与えています。

また、私が心配しているのは、この種のブログ投稿が人々を関数型言語から遠ざけることです.少数の荒らしは、人々がコミュニティ全体への信頼を失うようにします.たとえば、記事に対するMediumのコメントは次のとおりです:

関数型プログラミング コミュニティのほとんどの人はフレンドリーで、お気に入りの言語に対してそのような偏見を持っていませんのでご安心ください。

<オール>
  • https://docs.microsoft.com/en-us/dotnet/csharp/pattern-matching↩
  • https://en.cppreference.com/w/cpp/utility/optional↩
  • https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Optional.html↩
  • https://babeljs.io/docs/en/babel-preset-typescript↩
  • https://en.wikipedia.org/wiki/Dependent_type↩
  • https://guide.elm-lang.org/interop/custom_elements.html↩