2

インスタンスに関する以前の質問に続いてData.Vector.Generic.Vector、なぜだろうと思い始めました。

zipWith :: (Vector v a, Vector v b, Vector v c)
        => (a -> b -> c) -> v a -> v b -> v c
zipWith f xs ys = unstream (Stream.zipWith f (stream xs) (stream ys))

そしてそうではない

zipWith :: (GV.Vector v1 a, GV.Vector v2 b, GV.Vector v3 c) 
        => (a -> b -> c) -> v1 a -> v2 b -> v3 c
zipWith f xs ys = unstream (Stream.zipWith f (stream xs) (stream ys))

?

2番目のものは問題なくコンパイルされます。そのようなすべての機能を 1 つのインスタンスに制限する特定の理由はありますか? なぜなら、私にとって

v1 = Data.Vector.fromList [1,2,3,4,5]
v2 = Data.Vector.Unboxed.fromList [6,7,8,9] :: Data.Vector.Unboxed.Vector Int
v3 = foo (*) v1 v2 :: Data.Vector.Unboxed.Vector Int
v4 = foo (*) v1 v2 :: Data.Vector.Vector Int 

はるかに「一般的」に見えます。

4

1 に答える 1

2

署名内の単一の主な利点である IMOvは、これが引数のいずれかから常に推測できることです。よりポリモーフィックなアプローチでは、中間式のぎこちない明示的な型シグネチャを作成する必要があります (-XScopedTypeVariables通常、選択が「他の引数と同じVectorフレーバーを使用する」だけである場合に必要になる可能性があります (これはおそらく最良の選択パフォーマンスです) -賢明で、明らかなものです.多くの場合、それはあまり重要ではありません.型シグネチャについてまったく心配する必要がないのは良いことです.OTOH,異なるインスタンスを組み合わせる必要があるVector場合,正確な型は別の場所で修正されています.投げ込むのは些細なことだGV.convertよりポリモーフィックなバージョンに到達するための引数の 1 つの前。やや驚くべきことに、ポリモーフィック性を低くする方がはるかに簡単です。

于 2013-08-10T08:59:28.217 に答える