私は概念的にこれらのすべてが何であるか理解しています。MLとHaskellでそれらを実装する方法のコード例がほしいと思っています。mlとhaskellでスタティックスコープ、ダイナミックスコープ、およびレイジー評価を実装する方法は?
答えて
Haskell変数(最上位レベルの定義、パターン内の変数など)はすべて静的に有効です。たとえば、プログラム:
y = "global value"
f = print y
g = let y = "local value" in f
main = g
は「グローバル値」を出力します。 g
の定義では、関数f
が「再定義」y
の後で使用されても、この再定義はf
が定義されたy
の静的(AKA語彙的)スコープ定義を使用するf
の定義には影響しません。
ダイナミックスコープを「実装」したい場合は、実際に何を意味するのかを具体的に説明する必要があります。あなたのような、プレーンHaskellで関数を書くことができれば、あなたが迷っている場合:
addY :: Int -> Int
addY x = x + y
y
は1つのコールから次へと別の変数を参照するかもしれないというように、その後、答えはノーです。この定義では、y
は、常に同じ変数(Haskellでは同じ、不変の値を意味する)を参照します。これはプログラムの静的解析によって決定でき、動的に再定義することはできません。しかし、@ Jon Purdyは、ダイナミックスコープの形式をサポートするHaskell拡張機能があることを指摘しています。これは、次のように、同じ関数でさまざまな動的スコープのローカル値を出力するようになります。遅延評価のためedit--]
の
{-# LANGUAGE ImplicitParams #-}
f :: (?y :: String) => IO()
f = print ?y
g = let ?y = "g's local value" in f
h = let ?y = "h's local value" in f
main = do
g -- prints g's local value
h -- prints h's local value
let ?y = "main's local value" in f -- prints main's value
--end、例えば以下は、対話のGHCiセッションに入力された多くの例がある:
take 3 [1,2..] -- gives [1,2,3]
let x = (15^2, 6 `div` 0)
fst x -- gives 225
let y = snd x
y -- *** Exception: divide by zero
最初に評価が厳格であれば、無限リスト[1,2..]
を完全に評価しようと試みると([1..]
と書くこともできます)、無限ループに入り、take
関数は決して呼ばれることはありません。 2番目の例では、評価が厳密であれば、x
が定義されたときに、2番目のコンポーネントを印刷しようとするだけでなく、ゼロ除算が発生します。
動的スコープ付き変数の拡張子はImplicitParamsです。たとえば、 'pr ::(?currentOutputHandle :: Handle、Show a)=> a - > IO();とすると、 pr x = hPrint?currentOutputHandle x'を指定すると、出力をローカルにリダイレクトすることができます。 'let?currentOutputHandle = stderrをpr" foo "'に入れます。 –
あなたは正しいです!そして、私は数時間前に接続を行わずにこの拡張機能を調べていました。 –
- 1. F#レイジー評価と非レイジーの比較
- 2. ハスケル:TCOとレイジー評価
- 3. Haskellのレイジー式で評価された未定義のユニットテスト
- 4. &&および||が多いステートメントを評価する方法条件
- 5. レイジーIOの強制評価
- 6. レイジーzipWith、ここでHaskellのコードを評価する2つの無限リスト
- 7. でパス、および評価、dplyrパッケージ
- 8. Rubyチャレンジ - メソッド連鎖とレイジー評価
- 9. 実装JS評価
- 10. 方法:スプリントとリストの評価がhaskellで動作する
- 11. ヌルフリーデザインでリスト、セット、およびマップを実装する方法は?
- 12. PYTHON評価およびそれ以前
- 13. レビュー数および評価 - schema.org
- 14. レイジー評価は(ORMなどで)どのように実装されていますか?
- 15. 言語評価の質問:Eager Vs.レイジー
- 16. 依存プロパティのMATLABレイジー評価
- 17. Ember-validationレイジー検証の実装方法
- 18. Atom with Stack(Haskell) - IDE内でインタラクティブに評価する方法
- 19. Emacs用のHaskellモードでの単一式の評価方法は?
- 20. MySQL論理評価はJOIN節でレイジー/短絡ですか?
- 21. ユーザー定義関数で短絡評価を実装する方法は?
- 22. Haskellの式評価ツリー
- 23. Rのレイジー評価は影響を受けていますか?
- 24. 自動成績評価MathQuillおよび/またはMathJax
- 25. コンパイル時および実行時に評価されるconst char * constexpr
- 26. レイジー評価と隠れた環境がR
- 27. Google Cloud MLエンジン「同じチェックポイントによる評価のスキップ」
- 28. Neo4j 5 Starユーザー評価の実装
- 29. 実装の星の評価角度
- 30. 評価中\ _ - > Haskellで未定義
「実装する」とはどういう意味ですか?静的スコープ、動的スコープ、遅延評価のコードサンプルが必要ですか?また、これらの機能を備えたmlやHaskellでインタープリタを実装しますか?どちらの場合でも、問題は少し広いです。 – Alec
http://okmij.org/ftp/Computation/dynamic-binding.html – coredump
@Alec最初のオプション –