2012-05-31 10 views
15

だが、私はこの機能を持っているとしましょうか?計算作業(xは、x)は

最初は明らかに一定だと思っていましたが、xのタイプが有限でない場合、xは任意の量のメモリを取ることができますか? 1つは、xもコピーすることによって行われた作業を考慮する必要がありますか?

これは、関数によって行われた作業が入力のサイズにおいて実際は線形であると私に信じさせました。

これは、自分自身のための宿題ではありませんが、私は関数によって行われた作業を定義しなければならなかったときに思いついた:

f x = [x] 

同様の問題を持って、私は信じています。

+0

http://cs.stackexchange.com/ – FlavorScape

+0

私はそれを移動する必要がありますか? (私ができるとすれば、私はサイトに精通していません) – Guido

+1

@Guidoそれを移動することはできませんが、それはあまりにも私がそれに合うと思う宛先に移動することはできません。 IMHOそれをここに残すことが最善です。 – fuz

答えて

33

非常に非公式に、実行される作業は、言語の操作上のセマンティクスによって異なります。 Haskellは、まあ、それは怠け者だ、あなたはにのみ一定の要因を支払う:その引数

  • リターンaに(,)を適用(,)
  • のヒープ・セルを割り当てるスタック
  • x

    • プッシュポインタヒープセルへのポインタ

    完了。 O(1)作業者は、発信者がfの結果を確認したときに実行されます。

    (,) - の内部を調べると、評価が行われ、その作業はxの評価作業に依存します。 Haskellではxへの参照が共有されているため、一度だけ評価します。

    したがって、結果を完全に評価した場合、ハスケルの仕事はO(仕事のx)です。あなたの関数fは、定数を加えるだけです。

  • +7

    さらに明確にするために、Haskellの '(、)'は* boxed *タプルであり、単にポインタを保持する構造体であることを意味します。 '(、)'が* unboxed *タプルを生成する言語を持っているなら、 'x'がポインタよりも大きければ' x'を両方のスロットにクローン化するために余分な作業が必要になります。 'x'の大きさでスケールします。 [GHCは、さまざまな制限付きのボックス化されていないタプルを提供しています(http://www.haskell.org/ghc/docs/7.4.1/html/users_guide/primitives.html#unboxed-tuples) '(#、#)' –

    1

    Chris Okasakiは、いくつかの(または全体的な)怠惰が導入されたときに、関数呼び出しに費やされる仕事を決定する素晴らしい方法を持っています。純粋に機能的なデータ構造に関する彼の論文にあると思います。私はそれが本の版にあることを知っています - 私は先月のその部分を読んだ。基本的には、作成された約束/サンクの一定の要素を請求し、約束/サンクスを評価するために何も請求しません(彼らは既に強制されていると仮定します[通常の形式[WHNFだけではありません])。それは過小評価です。あなたが過大な課金をしたい場合は、通常の形式に強制する/変換するコスト。関数によって作成された約束/サンク。少なくとも、それは私が非常に疲れた状態でそれを覚えている方法です。

    岡崎で調べてみましょう:http://www.westpoint.edu/eecs/SitePages/Chris%20Okasaki.aspx#thesis - 私はダウンロードして使用される論文を誓います。

    +0

    多面的な議論を持つハスケルでは、岡崎の方法を無効にするようです。 (1)できるだけ避けてください。 (2)私はこれを完全には分析していないが、それは単なる直感である。 –

    関連する問題