は、私は、私はこのような何かを行うことができ、パターンマッチングを使用して、リストの長さの機能を実装したいと言う:ハスケルで空のベクトルをパターンマッチングする方法は?
length' :: (Num b) => [a] -> b
length' [] = 0
length' (_:xs) = 1 + length' xs
私はVector
sの似た何かを行うことができますか?
は、私は、私はこのような何かを行うことができ、パターンマッチングを使用して、リストの長さの機能を実装したいと言う:ハスケルで空のベクトルをパターンマッチングする方法は?
length' :: (Num b) => [a] -> b
length' [] = 0
length' (_:xs) = 1 + length' xs
私はVector
sの似た何かを行うことができますか?
ライブラリのさまざまな種類は、データコンストラクタを公開しない不透明な型であり、パターンマッチはできません。
あり(言及user2407038によってコメントとして)ViewPatterns
のように、この回避する方法は、ありますが、あなたはおそらくベクトルを使用することの利点を捨てると思いますので、あなたは確かには、ベクターを用いてこれらを使用する必要はありません。
vector
ライブラリーのハイライトは、それが二つの概念に基づいて実装されていますということです。
(1)ベクトルが自然な「ヘッド」やリストなどの「尾」を行う-のリストを持っていないことを意味文字通り 1対のヘッドとテールです。ベクターの上にhead + tail構造を課すためにある種のビューパターンを使用する場合は、ベクトル要素の単一リンクリストを効果的に作成します。ビュータイプ。
ViewPatterns
を使用して、効果的に1つのリンクされたリストとしてベクターを表示している場合、ベクターをリストに変換するだけではどうですか?
上記の設計上の理由により、vector
となると、実際にはthe operations provided by the library itselfに可能な限り貼り付けたいと考えています。これはライブラリのパフォーマンス機能を活用するためです。
多くの場合、ベクトルのサイズをテストすることは、最適ではない可能性があると考えられます。たとえば、次のようなコードで:
example :: Vector something -> Vector somethingElse
example as
| Vector.null as = ...
| otherwise = ...
...私は期待する(ただし、確認していません!)我々はそれが空だかどうかをテストできるように、これはマテリアライズされるベクトルas
を強制するだろうと、どこテストを削除したり別の場所に移動したりすると、 "..."ビットの操作がexample
が使用されているコンテキストと融合する可能性があります。
'Vector.empty :: Vector a'は、実際には空のベクトルを返します。代わりに 'Vector.null :: Vector a - > Bool'を使用したいでしょう。 –
@JanGerlinger:Ooops!良いキャッチは、修正されました... –
「ViewPatterns」や「PatternSynonyms」のようなものを使って抽象型のパターンマッチングを行うことができますが、 'vector'に' length'のような帰納的関数を書いたければ 'foldl 'または' foldr'、あるいは 'vector 'が提供する" fold "の他のダースまたはそれ以上のバリアントのいずれかです。これには、例えばFoldableを使用する場合、すべてのFoldableに一般化するという利点があります。 'Data.Foldable.foldr'を' vector'の特定のバージョンの代わりに使用します。 – user2407038
'case splitAt 1 v of ...'?上に示唆したように、おそらく 'ViewPattern'になりました。 – chi
パターン同義語に注意してください。彼らはうまく設計されていない場合、パフォーマンスの直感を破ることができます。 – dfeuer