2016-05-03 20 views

答えて

7

-XViewPatternsは、あなたがこれを行うを聞かせすることができますVector)を別のもの([])として使用すると、データ構造の選択肢がオフになっている可能性があります。

実際にはアルゴリズムの目的のためにリストのように扱いたい場合は、toListを使用しないでください。

+1

パターンシノニムを使用することもできます: 'pattern x ::: xs <- (uncons -> Just(x、xs))' – Cactus

+0

ビューパターンはまだ必要ですか?ガードパターンはありませんか? – mb14

+0

'Vectors'で動作する' Statistics'ライブラリの関数を使用しています。だから私は明らかに 'toList'を使って私のリストを処理し、' fromList'を使って関数を使う必要がありましたか?ポイントを敗北させるようですか? – matthias

1

ベクターは、パターンマッチングのようなもののために意図されていないエラーを与える - 彼らがアクセスすることができるハスケル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 

しかし、あなたは一つのデータ構造を使用していると正直に、その者は、(コードのにおいのビットのように思える:

+0

私はベクトル上で 'f :: Vector a - > a'の関数を実行しようとしていますが、新しい項目が追加されるたびにベクトルを移動して再計算します。すなわち、 '[1,2,3,4,5,6,7,8,10]'に、 '' [f [1]、f [1,2]、f [1,2,3]にしたいです。 。] 'など。 – matthias

+0

@matthiasは[スキャン]です(https://hackage.haskell.org/package/vector-0.11.0.0/candidate/docs/Data-Vector.html#g:34) – rampion

+0

@rampion申し訳ありませんが、私はちょっと混乱しています。スキャンは結果を次の反復に渡す累積関数ではありませんか?上記のスキャン機能をどのように作成すればよいですか?私はあなたの助けに感謝します。 – matthias

関連する問題