9

静的型付けと遅延関数型言語の関係に興味があります。たとえば、動的な遅延関数型言語を使用することは可能ですか? そこにあるすべての怠惰な関数型言語 (Haskell、Miranda など) は静的に型付けされており、すべての動的関数型言語 (Clojure、Scheme など) は厳密な評価を使用しているようです。

特に、遅延評価に関するウィキペディアの記事には次のように書かれています。

ただし、遅延評価では、操作の順序が不定になるため、例外処理や入出力などの命令型機能と組み合わせることが困難です。遅延評価により、スペース リークが発生する可能性があります。

スペースリークを防ぐために静的型付けが果たす役割は何ですか?

4

4 に答える 4

14

私は、静的型が役割を果たしているとはまったく考えていません。たとえば、型指定されていない遅延言語Lazy Racketについて考えてみます。Haskell (たとえば) がしない方法でスペースがリークするという兆候は聞いたことがありません。

一方、副作用問題です。なぜなら、人間は厳密な評価の評価の順序が (比較的) 自然であることに気づき、call-by-need は精神的に予測するのがはるかに難しいからです。

于 2012-10-16T03:17:09.983 に答える
6

スペースリークを防ぐために静的型付けが果たす役割は何ですか?

型を使用してオブジェクトの有効期間を追跡し、静的にリークがないことを確認できます。

例としては、領域の種類とその他の効果の種類があります。

于 2012-10-16T04:52:43.727 に答える
3

遅延評価と静的型付けは独立した概念です。

  1. 型なし
  2. タイプされた
    • 遅延評価Haskell がその例です。
    • Eager Evaluation OCaml はその一例です。

大雑把に言えば、評価はプログラムが実行されたときに発生するものです。タイピングは、プログラムのコンパイル時に発生するものです。

しかしもちろん、型付けシステムと評価戦略の間には重要な対応があります。

MがNおよびM:σ ( Mσ型) に還元される場合、 N:σ

これは、何らかの型σを持つプログラムを実行すると、値が同じ型を持つことを意味します。このプロパティがなければ、型付けシステムは (少なくともプログラミングには) 本当に役に立ちません。これはまた、コンパイル中にプログラムを入力すると、結果が正しいタイプになることがわかっているため、評価時に入力情報を覚えておく必要がないことも意味します。


あなたが引用しているウィキペディアの記事について。2 つの異なる点があります。

  1. 必須機能。これは、タイピング システムとはまったく関係ありません。問題は、特定の式の評価に (ほとんどの言語の I/O のように) 副作用がある場合、遅延設定で副作用が発生したとしてもいつ発生するかを予測するのが非常に難しいことです。したがって、遅延評価を行うと、不純な言語を持つことはほとんどありません。

    これに対する 1 つの例外は、Clean言語です。特別な型システムを使用して、怠惰な設定で副作用を処理します。したがって、ここでは、副作用の処理を通じて、評価戦略と型付けシステムの間に何らかの関係があります。型システムでは、遅延評価を維持できるような方法で副作用を処理できます。

  2. スペースが漏れます。これは、遅延評価の既知の欠点です。評価されていない式の構築またはChを参照してください。25 Real World Haskell でのプロファイリングと最適化。しかし、これは型システムとは何の関係もありません。型指定されていない言語でも同じ動作になります。
于 2012-11-17T11:55:40.857 に答える
2

より一般的なレベルから物事を見ると、静的型付けと遅延関数型言語の間に自然な関係が見られると思います。静的型の主なポイントは、コンパイラの機能を通知して向上させることです。言語間の静的と動的の違いを調査し、コンパイルされたコードと解釈されたコードの間の分裂を一般的に追跡します。

そして、遅延評価のポイントは何ですか?

Peyton-Jones らによる悪名高い遡及記事では、遅延評価を、言語を純粋に関数型に保つ「ヘア シャツ」と説明しています。彼の比喩は、Haskell コミュニティの根深い意味論の理想主義を適切に伝えています。非正格評価の基本的な利点は、この表示パラダイムを容易にする方法でコードを構造化する可能性を変換することです。Bob Harper と Haskell コミュニティによって行われた悪名高い遅延評価の議論で、Harper 教授は遅延評価が実際のプログラムにもたらす課題を示しています。

「厳密な評価の最大の不満は最後に残しておきました。厳密な評価は、関数の再利用に関して根本的に欠陥があります。[...] 厳密な評価では、再帰を使用しないで、 map、filter、foldr などの再帰パターン。(一般的には)単純に機能しません。[...] 厳密な評価は、基本的に、怠惰な方法で関数を再利用することを妨げます。"

そして、遅延評価による関数の再利用の例として、Augustsson は次のように述べています。anymaporコーディングの。

コーディングの抽象的で表示的なスタイルを維持するために他に何が必要でしょうか? 強力な最適化コンパイラが役に立つかもしれません! したがって、静的型と遅延評価の間に技術的または必要な関連性がない場合でも、2 つの機能は同じ目標に向かっています。彼らがしばしば一緒に現れるのはそれほど驚くべきことではありません.

于 2012-11-17T02:28:42.913 に答える