2012-09-09 6 views
5

Data.ArrayArrayタイプの折り目を提供していません。 (CH 12)なぜHaskellは1次元配列の折り畳みを提供しないのですか?

実世界Haskellで

が、その理由はArray sがプログラマのニーズに基づいて異なる方法で折り畳むことができることと言われているすべての

まず、いくつかの種類があります折り畳みが意味をなさないまだ単一の要素に折りたたみたいかもしれませんが、行や列を折り畳むことも可能です。これに加えて、一度に1つの要素を折りたたむ場合、もはや横断のシーケンスは2つだけではありません。

正確にはListではありませんか?たとえば、次のように表現するのは非常に一般的です。多次元Listの行列ですが、一次元のために定義された折り目はまだあります。List s。

私が欠けている繊細は何ですか?それは多次元ArrayArray秒のArrayから十分に異なっていることですか?

編集:フム、でも多次元配列はData.Foldableのインスタンスの形で、折り目が定義されていない[0]では、どのように引用実世界Haskellので収まるんこと?

[0] http://hackage.haskell.org/packages/archive/base/4.6.0.0/doc/html/Data-Foldable.html

+0

多次元配列とネストされたリストの違いは、すべての配列が本質的に同じ型であることです。つまり、配列型、配列型(Int、Int)e、配列(Int、Int、Int)e ...です。したがって、1次元配列に対してのみ定義された関数を作ることはできませんが、 'foldr'はすべてのリストを連結して要素ごとに処理するのではなく、リストのリストを取り出してリストで処理します。 –

答えて

8

あなたがリストと比較すると一緒に、素敵なポイントを説明しますArray「多次元」とArrayArrayのsの間の差を、言及しているので。

Foldableクラス意味で)倍リストは、本質的に線状構造であると同様に、本質的に線形演算です。右のフォールドは、そのコンストラクタを1対1の引数をfoldrに一致させることによってリストを完全に特徴付けます。foldlのような関数を定義することもできますが、標準的な標準的なフォールドを明確に選択できます。

Arrayは、1対1で折りたたみ可能な透明な構造を持たない。これは抽象型で、インデックス値によって提供される個々の要素にアクセスでき、Ixインスタンスを持つ任意の型であることができます。したがって、フォールドを実装するための単一の明白な選択肢がないだけでなく、固有の線形構造もありません。 Ixではインデックスの範囲を列挙できますが、これは他のものより実装の詳細です。

多次元はどうですか。Array?それらは実際には存在しません。 Ixは、インスタンスでもあるタイプのタプルのインスタンスを定義します。そのようなタプルを「多次元」のインデックスタイプと考える場合は、Arrayを進んでください。しかし、彼らはまだ単なるタプルです。明らかに、Ixはそれらのタプルに線形順序を入れますが、それは何ですか?あなたが教えてくれるドキュメンテーションで何かを見つけることができますか?

だから、私はあなたが本当にあなたが要素を何を得るために気にしないしない限り、私たちが安全にIxによって定義された順序を使用して多次元Arrayを折ることは賢明であると言うことができると思います。

Array秒のArrayについて一方、ネストされたリストのように、それらを結合する唯一の賢明な方法があります。それぞれの内部を要素の順番に従って個別に折り返し、外側のの要素の順番に従ってそれぞれの結果を折ります。


は今、あなたは合理的に一次元および多次元Array S、および元の間にはタイプの区別はありませんから、なぜ単に使用しないIxインスタンスに基づいて賢明な折り畳みの順序を持​​っていると仮定することができ、そのオブジェクトかもしれませんその順序はデフォルトですか?結局のところ、リスト内のArrayの要素を返す関数が既にあります。

ライブラリー自体は、Foldableインスタンスと同じであるため、あなたに同意します。

4

foldrあるリストを折るする一つの自然な方法は、あります。リストコンストラクタの種類注意:b[a]の発生を置き換える

(:) :: a -> [a] -> [a] 
[] :: [a] 

を、私たちはこれらの型を取得します:

f :: a -> b -> b 
z :: b 

そして今、当然のことながら、foldrの種類は、この原理に基づいています:

foldr :: (a -> b -> b) -> b -> [a] -> b 

だからリストの構築/観測セマンティクス与えられ、foldrはモスだものです自然。 「(:)と何[]を行うにして何をすべきかを教え、そして私はあなたのためのリストを取り除くでしょう。」とあなたはタイプを読み取ることができます

Arrayは、このプロパティを持っていません。アソシエーションリスト(Ix i => [(i,a)])から配列を作成し、その型は本当に再帰的構造体を公開しません。リストまたはツリーが再帰的コンストラクタを介して他の配列から構築された配列はありません。

+0

+1 "(:)で何をするかを教えてください。また、[[]"と何をすればいいのでしょうか? - 私は本当にそれが好き! – epsilonhalbe

関連する問題