2016-04-14 9 views
5

は、私は、私はこのような何かを行うことができ、パターンマッチングを使用して、リストの長さの機能を実装したいと言う:ハスケルで空のベクトルをパターンマッチングする方法は?

length' :: (Num b) => [a] -> b 
length' [] = 0 
length' (_:xs) = 1 + length' xs 

私はVector sの似た何かを行うことができますか?

+3

「ViewPatterns」や「PatternSynonyms」のようなものを使って抽象型のパターンマッチングを行うことができますが、 'vector'に' length'のような帰納的関数を書いたければ 'foldl 'または' foldr'、あるいは 'vector 'が提供する" fold "の他のダースまたはそれ以上のバリアントのいずれかです。これには、例えばFoldableを使用する場合、すべてのFoldableに一般化するという利点があります。 'Data.Foldable.foldr'を' vector'の特定のバージョンの代わりに使用します。 – user2407038

+0

'case splitAt 1 v of ...'?上に示唆したように、おそらく 'ViewPattern'になりました。 – chi

+3

パターン同義語に注意してください。彼らはうまく設計されていない場合、パフォーマンスの直感を破ることができます。 – dfeuer

答えて

3

ライブラリのさまざまな種類は、データコンストラクタを公開しない不透明な型であり、パターンマッチはできません。

あり(言及user2407038によってコメントとして)ViewPatternsのように、この回避する方法は、ありますが、あなたはおそらくベクトルを使用することの利点を捨てると思いますので、あなたは確かには、ベクターを用いてこれらを使用する必要はありません。

vectorライブラリーのハイライトは、それが二つの概念に基づいて実装されていますということです。

  1. ベクターは固定サイズ、シングルよりもはるかに優れたメモリの局所性を提供し、連続したメモリアレイ、として実体化されている リンクされたリストまたはツリー。
  2. 多数のベクトル演算が可溶性ストリームの観点から実装され、演算は中間ベクトルのためのメモリを割り当てないループにコンパイルされます。

(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が使用されているコンテキストと融合する可能性があります。

+1

'Vector.empty :: Vector a'は、実際には空のベクトルを返します。代わりに 'Vector.null :: Vector a - > Bool'を使用したいでしょう。 –

+1

@JanGerlinger:Ooops!良いキャッチは、修正されました... –

関連する問題