2016-05-18 15 views
1

ジェネリックベクターインターフェイスを使用するときに型シグネチャを定義する際に問題があります。ボックス化されていないベクトルとボックス化されていないベクトルの両方で動作するメソッドを構築したいと思います。Data.Vector.Genericインターフェイスの使用

これは動作しますが、箱入りのベクトルに拘束されています

import   Control.Monad.ST 
import   Data.Vector     as V 
import   Data.Vector.Generic   as VG 
import   Data.Vector.Generic.Mutable as VGM 
import   Data.Vector.Mutable   as VM 
import   Data.Vector.Unboxed   as VU 
import   Data.Vector.Unboxed.Mutable as VUM 

mySwap :: V.Vector a -> V.Vector a 
mySwap vec = runST $ do 
    vec_mut <- V.thaw vec 
    VM.swap vec_mut 0 1 
    V.unsafeFreeze vec_mut 

私は一般的なインタフェースを使用するためにはVGVを変更する場合、2つの引数は型シグネチャにベクトルのために必要とされているが、私「最初の引数制約するかどうかはよく分からない:タイプ予想

mySwap2 :: VG.Vector v a -> VG.Vector v a 
mySwap2 vec = runST $ do 
    vec_mut <- VG.thaw vec 
    VGM.swap vec_mut 0 1 
    VG.unsafeFreeze vec_mut 

を、しかしVG.Vector v aは親切 を持っていますGenericモジュールにおいて

答えて

1

Vector例えば、型クラスであり、制約として使用する必要があります

mySwap2 :: VG.Vector v a => v a -> v a 

これは:vaを保持することができるベクターのいくつかの種類でありますs。最初はこれがもたらした

gswap v = runST $ do 
    vmut <- VG.thaw v 
    VGM.swap vmut 0 1 
    VG.unsafeFreeze vmut 

2

私は型シグネチャを削除し、GHCが私を案内させて

Illegal equational constraint Mutable v ~ Mutable v 
(Use GADTs or TypeFamilies to permit this) 

それがコンパイルされ、:t gswapが返さLANGUAGE TypeFamiliesを追加した後:

gswap 
    :: (VG.Vector v a, VG.Vector v1 a, Mutable v1 ~ Mutable v) => 
    v a -> v1 a 

しかし、vv1は、同じタイプの可変制約が自明に満たされており、TypeFamilies拡張は必要ありません。

+0

これは非常に便利なトリックです。 – tsorn

+2

GHCをあなたの友人にさせてください。また、[部分型署名](https://ghc.haskell.org/trac/ghc/wiki/PartialTypeSignatures)を参照して、GHCで型署名のどの部分を指定するかを教えてください。 – ErikR

関連する問題