私は次の(比較的簡単な)個人的なプロジェクトのためにHaskellに飛び込んでいます。私がHaskellに取り組んでいる理由は次のとおりです。
したがって、これを考えると、私が探しているのは、Haskellに伴う欠点または問題です。 Webには、Haskellがなぜ良いものであるかについての膨大な情報がありますが、その醜い側面に関する多くのトピックは見つかりませんでした(その構文についての不満を除いて、まったく気にしません)。
私が探しているものの例は、PythonのGILのようなものです。 CPython環境で同時実行の使用を実際に検討し始めるまでは、頭が動かなかったものです。
私が考えることができるいくつかの欠点:
Haskellの欠点のほとんど(およびHaskellの利点のほとんど)は、2つの明確な特徴から来ています。
怠惰になると、パフォーマンスについて推論するのが難しくなります。特に怠惰に慣れていない人にとっては、経験豊富なHaskellerでさえ、怠惰が特定の場合にパフォーマンスにどのように影響するかを理解するのは難しい場合があります。
怠惰はまた、Criterionのようなライブラリを使用せずに正確なベンチマークを作成することが困難であることも意味します。
純粋に機能するということは、可変データ構造を使用する必要があるときはいつでも(それらなしでは望ましいパフォーマンスを達成することができない場合-考えられるほど頻繁には発生しないGHCのオプティマイザのおかげです)、 IO(またはST)モナドで立ち往生しているため、コードが煩雑になります。
目標の1つとして速度を挙げたので、手動で最適化されたHaskellコードと、パフォーマンスをあまり考慮せずに(他の言語よりも)書かれたHaskellコードのパフォーマンスには大きな違いがあることが多いことを指摘しておきます。そして、手作業で最適化されたHaskellコードは、しばしば非常に見苦しくなります(他のほとんどの言語でもそうだと思いますが)。
私はHaskellの専門家ではありません。基本を学びましたが、残念ながらHaskellで真剣なプロジェクトを行う機会がありませんでした(ただし、この言語が大好きなので、やりたいと思います)。
しかし、私が知っていることと、関数型プログラミングに非常に近い分野で働いている誰かとの議論から、グラフアルゴリズムを実装する場合、Haskellは最適なソリューションではない可能性があります。グラフをウォークスルーし、グラフ構造に対して多くのローカル変更を実行します。
グラフは一般に再帰的な構造を持たないので、私の考えでは、構造とそれらの間のポインターを使用してグラフの1つのコピーを作成し(C++で行うことができるように)、ポインターを変更することによってそのコピーを操作することです。ノードの作成または破棄など。
Haskellでの私の知識では、上記の表現/アプローチを使用することはできないため、Haskellでこのようなデータ構造と操作を適切に処理するにはどうすればよいのでしょうか。 Haskellのグラフアルゴリズムに関するいくつかの問題について、簡単に説明します この記事
[〜#〜]編集[〜#〜]
私は最近関数プログラミングの専門家と話をしました、そして彼は特定のグラフアルゴリズムを効率的に実装することはHaskellでかなりトリッキーであるかもしれないことを確認しました:CまたはC++で行うようにポインターを移動することははるかに速くなることができます。
Haskellの欠点は、その違いです。これは、より一般的に教えられたり話されたりする言語から大きく離れているため、学習曲線が大きくなります。また、行き詰まった場合のヘルプの利用を制限する可能性のある言語の人気も低くなります。しかし、これらは本当に大きな欠点ではありません。
潜在的な欠点の1つは、それが関数型言語であることです。そのため、特定の問題領域ではあまり役に立ちませんが、これはオブジェクト指向言語にも当てはまります。一般に、言語は、少なくとも比較的人気のある言語については、学習曲線を超える真のネガティブはありません。言語がチューリング完全である限り、それは理論的には何でもできます。
だから、これを考えると、私が探しているのはHaskellに伴う欠点または問題です
「Haskellの問題」は、特定のドメインで発生する傾向があります。 Haskellは、アプリケーションプログラミングにとってすばらしい言語であり、他の何よりも書くのがはるかに楽しいです。次のようなサポートが不十分なことをしようとすると、問題が発生する傾向があります。