ベクトル上でリストスタイルのパターンマッチングを使用することは可能ですか?ベクトル上のHaskellパターンマッチング
すなわち
import qualified Data.Vector as V
f :: V.Vector a -> a
f (x:xs) = x
は
ベクトル上でリストスタイルのパターンマッチングを使用することは可能ですか?ベクトル上のHaskellパターンマッチング
すなわち
import qualified Data.Vector as V
f :: V.Vector a -> a
f (x:xs) = x
は
-XViewPatterns
は、あなたがこれを行うを聞かせすることができますVector
)を別のもの([]
)として使用すると、データ構造の選択肢がオフになっている可能性があります。
実際にはアルゴリズムの目的のためにリストのように扱いたい場合は、toList
を使用しないでください。
ベクターは、パターンマッチングのようなもののために意図されていないエラーを与える - 彼らがアクセスすることができるハスケルO(1)リスト、またはリストを与えるために作成されました効率的な任意のポイントから。
あなたが書いたものに最も近いものは、このようなものになるだろう:再帰はあなたが探しているものであれば、
f v = V.head v
あるいは、tail
関数は、リストの残りの部分を取得します。
しかし、そのようなリストに沿って動くものをしようとすると、foldl
,find
,map
などのような関数のベクトル相当物があります。それはあなたがしようとするものによって決まります。
{-# LANGUAGE ViewPatterns #-}
module VecViewPats where
import Data.Vector (Vector)
import qualified Data.Vector as V
uncons :: Vector a -> Maybe (a, Vector a)
uncons v = if V.null v
then Nothing
else Just (V.unsafeHead v, V.unsafeTail v)
vsum :: Num a => Vector a -> a
vsum (uncons -> Just (a,av)) = a + vsum av
vsum (uncons -> Nothing) = 0
それとも-XLambdaCase
import Control.Category ((>>>))
-- ...
vsum :: Num a => Vector a -> a
vsum = uncons >>> \case
Just (a,av) -> a + vsum av
Nothing -> 0
しかし、あなたは一つのデータ構造を使用していると正直に、その者は、(コードのにおいのビットのように思える:
私はベクトル上で 'f :: Vector a - > a'の関数を実行しようとしていますが、新しい項目が追加されるたびにベクトルを移動して再計算します。すなわち、 '[1,2,3,4,5,6,7,8,10]'に、 '' [f [1]、f [1,2]、f [1,2,3]にしたいです。 。] 'など。 – matthias
@matthiasは[スキャン]です(https://hackage.haskell.org/package/vector-0.11.0.0/candidate/docs/Data-Vector.html#g:34) – rampion
@rampion申し訳ありませんが、私はちょっと混乱しています。スキャンは結果を次の反復に渡す累積関数ではありませんか?上記のスキャン機能をどのように作成すればよいですか?私はあなたの助けに感謝します。 – matthias
パターンシノニムを使用することもできます: 'pattern x ::: xs <- (uncons -> Just(x、xs))' – Cactus
ビューパターンはまだ必要ですか?ガードパターンはありませんか? – mb14
'Vectors'で動作する' Statistics'ライブラリの関数を使用しています。だから私は明らかに 'toList'を使って私のリストを処理し、' fromList'を使って関数を使う必要がありましたか?ポイントを敗北させるようですか? – matthias