2016-03-31 5 views
4

正しいデータコンテナを使用することは、Haskellではちょっと難しいかもしれません.2次元グリッドアプリケーションでは、UArrayを使用すると適切と考えられます。しかし、限り私はUArrayfoldableのインスタンスではない(Data.Array.IArrayでもData.Array.Unboxedでもない)と言うことができます。ボックス化されていない配列がfoldableのインスタンスではないのはなぜですか?

これには理由がありますか?私は自分自身のヘルパー機能を作ることができますが、foldableインスタンスが存在しないと、おそらく私はすべきではないことが示唆されます。

+0

少なくともGHCでは 'Array'は' GHC.Arr'の 'base'で定義されています。 'array'パッケージはこの型を再エクスポートします。 'Foldable'インスタンスは、配列モジュールではなく、[' Data.Foldable'](https://hackage.haskell.org/package/base-4.8.2.0/docs/src/Data.Foldable.html)で定義されています。しかし 'UArray'は' array'パッケージの 'Data.Array.Base'で定義されています。 'array'自体は、私が見る限り、' Foldable'インスタンスを全く定義していません。 – user2407038

+1

私はフードの中で何が起きているのかよく分かりませんが、 'Data.Array.IArray'パッケージに' Array'型の 'Foldable'インスタンスが含まれているようです。実際にそこにコード化されているかどうかは関係ありません。これは、利用可能なものがあれば 'UArray'型のインスタンスも提供しないということは愚かなようです。それは監視ですか? – user668074

答えて

7

Foldableで表現できない配列に含まれるデータ型に余分な制約が必要なため、このようなインスタンスは不可能だと思います。モノトラバーサルでは、ボックス化されていないベクトルと格納可能なベクトルのMonoFoldableインスタンスを定義します。

EDIT:明確にするために、私が参照してる制約がVectorに含まれる値がUnboxのインスタンスである場合Foldableが必要とするのに対し、Data.Vector.Unboxのすべての機能だけで、動作することになるfoldMapfoldrなど、 すべての可能なタイプ(リスト、ボックス化されたベクトルなどのタイプの場合と同様)で定義されています。 Foldable typeclassに「含まれている値がこれらの制約を満たす必要があります」と記述する方法はありません。 MonoFoldableには、

+0

ああ、特定の型の配列を持つことは、その型が実際に賢明であることを意味しないので(サイズを特定する方法はありません)?一方、 'vector'では、要素型はベクトル型を決定しますか? – dfeuer

+0

この制約がどんなものかについてもっと説明できますか?ボックス化されていない配列の折り畳み関数を定義できないと言っていますか? – user668074

+0

私の前のコメントを展開するために、折り畳み可能なインスタンスになるように、少なくともfoldMapとfoldrの定義が必要です。私はボックス化されていない配列に対してこれらを定義できない理由はわかりません。 – user668074

関連する問題