問題タブ [haskell]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
exception - Haskellで任意の例外をキャッチする方法は?
Haskellで例外をキャッチする方法は?
function - 関数適用:なぜここで$が使われるのですか?
少し前に$について質問したところ、役に立つ答えが返ってきました。実際、使い方は理解できたと思いました。
私は間違っていたようです:(
この例は、チュートリアルに表示されます。
なぜ$がそこで使われたのか、私には一生分からない。ghciも私を助けていません。私が行ったテストでさえ、単に$を省略したバージョンと同等であることが示されているようです。誰かが私のためにこれを明確にすることができますか?
haskell - Haskellモナド関数の使い方の良い例はありますか?
Haskellモナド関数は理解しにくいですが、使用例はどこにありますか?
haskell - Haskellアプリでメモリ使用量を減らすには?
私は関数型プログラミングの初心者で、Haskell を学んでいます。演習として、1D 線形拡散方程式に陽的オイラー法を実装することにしました。以下のコードは正しく動作しますが、そのパフォーマンスには満足できません。実際、私はメモリ消費に関心があります。遅延評価に関連していると思いますが、メモリ使用量を減らす方法がわかりません。
アルゴリズムの考え方は非常にシンプルで、命令的な用語で明確にします: 「配列」を取り、すべての内部ポイントに値を追加します。これは、ポイント自体とそのポイントの値の組み合わせとして計算されます。隣人。境界点は特殊なケースです。
これが私の Euler1D.hs モジュールです。
そして、単純な Main.hs:
比較のために、純粋な C 実装も作成しました。
ここで、十分に大きなサイズの array に対して Haskell 実装を実行しようとすると、次のn
ようになります。
比較のために、C バージョンはほぼ 2 桁高速です。
編集: Haskell バージョンはプロファイリング フラグを使用してコンパイルされており、C はそうではないため、この比較は実際には公平ではありません。
-O2
プロファイリング フラグを使用して、または使用せずに両方のプログラムをコンパイルすると、 を増やすことができn
ます。この場合time ./eulerhs 1000000
、0m2.236 秒かかりますが、time ./eulerc 1000000
0m0.293 秒しかかかりません。そのため、すべての最適化を行っても問題は残り、プロファイリングを行わないと、相殺されるだけです。また、Haskell プログラムのメモリ割り当ては、
n
. これで多分OKです。
しかし、最悪なのはメモリ要件です。私の Haskell バージョンでは100MB 以上が必要です (C での最低限の見積もりは4MBです)。これが問題の原因かもしれないと思います。プロファイリング レポートによると、プログラムは GC で 85% の時間を費やしており、
makeu0
それがとても高価なことを見て私は驚いた。これは遅延評価が原因であると判断しました (そのサンクが の最後までメモリに残っている場合stepEuler
)。
私はこの変更を試しましたMain.hs
:
しかし、違いはわかりませんでした。でメモリ使用量を減らす方法がわかりませんstepEuler
。だから、私の質問は次のとおりです。
- Haskell でリストを作成する方法/リスト内包表記を厳密に行う方法はありますか? この場合、怠惰にしておくメリットはありません。
- この場合、全体的なメモリ使用量を減らすにはどうすればよいですか? 私は何かを厳密にしなければならないと思いますが、何がわからないのですか。言い換えれば、
seq
s と bangs をいくつか入れなければならない場合、どこに、なぜ? - そして最後に、最も重要なのは、そのようなコストのかかる構造を特定するための最善の戦略は何ですか?
Real World Haskellのプロファイリングと最適化に関する章を読みましたが、厳密であるべきものとそうでないものをどのように正確に決定できるかは不明のままです。
このような長い投稿をお許しください。
EDIT2:コメントでA. Rexが示唆したように、valgrindで両方のプログラムを実行してみました。そして、これが私が観察したことです。Haskell プログラム (
n
=200000) の場合:malloc/free: 33 個の割り当て、30 個の解放、84,109 バイトが割り当てられました。... 55,712,980 バイトを確認しました。
そしてCプログラムの場合(小さな修正後):
malloc/free: 2 つの割り当て、2 つの解放、3,200,000 バイトの割り当て。
したがって、Haskell ははるかに小さいメモリ ブロックを割り当てますが、頻繁に割り当て、ガベージ コレクションの遅延によりメモリに蓄積されたままになるようです。それで、私は別の質問があります:
- Haskellで多くの小さな割り当てを避けることは可能ですか? 基本的には、必要に応じてデータ構造のフラグメントだけでなく、データ構造全体を処理する必要があることを宣言します。
haskell - Haskell で型推論を利用するのはいつですか?
経験豊富な Haskell プログラマーが実際に型推論を実際にどのくらいの頻度で使用しているかについて、私は興味があります。他の特定の言語で必要とされる常に明示的な宣言よりも優れていると称賛されることがよくありますが、何らかの理由で (おそらく私が初心者だからという理由で)、ほぼ常に型シグネチャを記述することが「正しい」と感じています.. . 場合によっては、本当に必要な場合もあります。
経験豊富な Haskeller (Haskellites? Haskellizers?) から情報を提供してもらえますか?
haskell - 関数型言語の特徴
すべての関数型言語は、関数をプログラムの基本的な構成要素として使用するなど、いくつかの基本的なプロパティを共有し、反復の代わりに再帰を使用するなどのすべての結果をもたらすことが知られています。ただし、いくつかの根本的な違いもあります。Lisp は Lisp コードとデータの両方に単一の表現を使用しますが、ML には ML コードの標準表現はありません。Erlang には組み込みのアクターベースの同時実行性があります。Haskell にはモナドがあります。Haskell は、静的型システムで純粋関数と非純粋関数を区別しています。ML にはありません。
他の関数型言語 (Clojure、F#、Arc、その他) との根本的な違いは何ですか? 基本とは、この言語で開発する方法に影響を与える何かを意味し、たとえば、それが広く普及したランタイムと統合されているかどうかではありません。
emacs - Haskell のような静的で強い型付けされた言語と、Common LIsp のような動的な (強い) 言語の両方での使用
私は Lisp の方言を扱っていましたが、Haskell もいくつか学んでいました。それらにはいくつかの類似点がありますが、Common Lisp での主な違いは、関数や引数などごとに型を定義する必要がないことです。Haskell ではそうします。また、Haskell はほとんどがコンパイル済み言語です。コンパイラを実行して実行可能ファイルを生成します。
私の質問は、Haskell のような言語が Common Lisp のようなより動的な言語よりも理にかなっているような別のアプリケーションや用途はありますか? たとえば、Lisp は Web サイトや GUI の構築など、より下位のプログラミングに使用できるようです。Haskell は、TCP/IP サーバーやコード パーサーの構築など、コンパイル時のチェックが必要な場合に使用できます。
人気のある Lisp アプリケーション: Emacs
人気の Haskell アプリケーション: PUGS Darcs
同意しますか、これに関する研究はありますか?
compiler-construction - Scalas/Haskells パーサー コンビネータで十分ですか?
Scalas/Haskells パーサー コンビネーターがプログラミング言語の解析に十分かどうか疑問に思っています。より具体的には、MiniJava 言語です。私は現在、コンパイラの構築を読んでおり、jflex と Java カップを使用するのは非常に面倒なので、代わりにパーサー コンビネータを使用できる/使用する必要があるかどうか疑問に思っています。MiniJava 構文は非常に小さいです。MiniJavas BNF: http://www.cambridge.org/us/features/052182060X/grammar.html
haskell - C++ の std::bind2nd に相当する組み込みの Haskell はありますか?
私が見逃しているのは、関数の最初の引数ではなく、2 番目の引数を部分的に適用する機能です。これは、関数をマップなどに渡したい場合に特に便利ですが、毎回ラムダを記述する必要はありません。
私はこれのために私自身の関数を書きました(以下の定義、実際にこれのための組み込み関数がなく、他の誰かが興味を持っていた場合に備えて)、これのためのプレリュードにすでに何かが存在するかどうかを本当に知りたいです私は再発明するよりも再利用したいので、イディオムです。
これが私の定義と簡単な例です。
haskell - クラス定義のパイプとはどういう意味ですか?
上のパイプの意味は何ですか?スニペットはhereから来ています。