関数型プログラミングの違いリスト


13

質問岡崎以来の純粋に機能的なデータ構造の新機能 (論理プログラミングではなく)、およびjbappleの叙事詩の答えは、私は最近、これが見つけるために私を導いた。に興味を持ってきたものですこれは、関数型プログラミングでは、差分リストを使用して言及した差分リストの Haskellのための実装を。2つの質問があります(StackExchangeで2つの異なる質問をする必要がある場合は、ご容赦ください。)。

簡単な質問は、Haskellライブラリにあるもの以外に、関数型プログラミングや実装の違いリストの学術的検討を知っている人はいますか?jbappleの答えは、差分リストの引用を提供しませんでした(ロジックプログラミングの差分リストは、伝承と、Around Here Somewhere(TM)にあるいくつかのソースにあります)。Haskellの実装を見つける前に、そのアイデアが論理から関数型プログラミングに飛躍したことを知りませんでした。確かに、Haskellの差分リストは高階関数の自然な使用であり、ロジックプログラミングのものとはまったく異なる動作をしますが、インターフェイスは確かに似ています。

私が聞きたかったのは、もっと興味深い(そしてずっと曖昧な)ものは、前述のHaskell差分リストライブラリの主張された漸近的上限かどうかです。正しい/妥当と思われるです。私の混乱は、怠inessな複雑さの推論について明らかなものを見逃しているためかもしれませんが、大きなデータ構造上の置換(またはクロージャー形成、変数ルックアップ、または何か)が常に一定の時間がかかる場合にのみ、主張された境界が意味をなします。または、「キャッチ」とは、単に「ヘッド」と「テール」の実行時間に制限がないということです。これらの操作は、遅延計算/置換の任意の山を耕さなければならないからです。


1
最初は「関数型プログラミング言語(関数型プログラミング言語ではなく)」に混乱していましたが、「(論理型プログラミング言語ではなく)」と書くつもりでしたか?
伊藤剛

ああ、うん、そういうことだ、今は修正されている。
ロブシモンズ

2番目の質問はStack Overflowではより適切なようですが、ここで質問したので、誰かがここで答えられるかどうかを確認するのを待つ方が良いかもしれません。個人的には、ソースコードを読むことで主張された限界を疑う理由を見つけることはできませんが、それらを疑うためにあなたの推論に従わず、また何かを見逃しているかもしれません。
伊藤剛

回答:


8

または、「キャッチ」とは、単に「ヘッド」と「テール」の実行時間に制限がないということです。これらの操作は、遅延計算/置換の任意の山を耕さなければならないからです。

Θmm

O1 fromList

{-# LANGUAGE NoMonomorphismRestriction #-}

data DL a = Id
          | Cons a
          | Compose (DL a) (DL a)

fromList [] = Id
fromList (x:xs) = Compose (Cons x) (fromList xs)

toList x = help x []
    where help Id r = r
          help (Cons a) r = a:r
          help (Compose f g) r = help f $ help g r

empty = Id

singleton = Cons

cons x = append (singleton x)

append = Compose

snoc xs x = append xs (singleton x)

Θnheadtail[a] -> [a]toList


したがって、怠lazから得られるのは、リストの末尾を2回要求しても、高価な操作が2回実行されないということだけです。
ロブ・シモンズ

@ロブ、それがどういう意味かわからない。
jbapple

私は(悪い)そこにしようとしていたポイントがこの例によって説明されていると思います:私は元のリストに物事を繰り返し「スノック」することによって作った非常に長い差分リスト「xs」を持っています。「head xs」を初めて呼び出すとき、遅延計算を行うにはO(n)時間かかると予想しています。ただし、その計算はメモされる必要があるため、「head xs」への2回目の呼び出し(同じ「xs」)はO(1)時間かかります。
ロブシモンズ

1
まあ、私はそれに同意しますが、私が答えで言及した怠はfromListについてでした。これはsnocやheadでは使用されません。ですから、私はあなたの声明の「何が怠lazから何を得ているのか」ということで、それ自体はつまらないものです。あなたの例と私の例はあなたが怠inessから得ている2つのものだと思います。
jbapple

わかりました-そして、その明確化は、あなたの以前のポイントをよりよく理解するのにも役立ちます。
ロブ・シモンズ

11

はい、境界は関数の合成に一定の時間がかかるという仮定に依存します。基本的に、結合リストがある場合:

datatype 'a join = Nil | Cons of 'a * 'a join | Join of 'a join * 'a join

連結が一定時間であること、そしてそれが Onこれをコンスリストに変換します。クロージャの通常の表現について考えると、これは基本的にデータ型の通常の表現と同じポインタ表現であることがわかります。(または、このタイプを機能停止された差分リストとして表示できます。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.