2015-12-01 8 views
7

İşte ibrenin uyum dönmek için basit bir fonksiyon var:ScopedTypeVariables kapsam içine tipi değişkenleri getirmiyor

{-# LANGUAGE ScopedTypeVariables #-} 

import Foreign.Ptr (Ptr) 
import Foreign.Storable (Storable, alignment) 

main = return() 

ptrAlign1 :: (Storable a) => Ptr a -> Int 
ptrAlign1 _ = alignment (undefined :: a) 

Ama aşağıdaki hatayı alıyorum: Ben ptrAlign yeniden Eğer

Could not deduce (Storable a0) arising from a use of `alignment' 
from the context (Storable a) 
    bound by the type signature for 
      ptrAlign1 :: Storable a => Ptr a -> Int 
    at prog.hs:8:14-41 
The type variable `a0' is ambiguous 

Bunun gibi bir daha dağınık hizip:

ptrAlign2 :: (Storable a) => Ptr a -> Int 
ptrAlign2 = ptrAlign3 undefined where 
    ptrAlign3 :: (Storable a) => a -> Ptr a -> Int 
    ptrAlign3 x _ = alignment x 

O ince (tabi bu sürümü işleri ScopedTypeVariables'a bile ihtiyaç duymaz.

Ama hala ilk sürümün neden hata yaptığını merak ediyorum ve bunu çözmek için ne yapılabilir? ScopedTypeVariables açık

cevap

10

olsa bile, tip değişkenler yani

ptrAlign1 :: forall a. (Storable a) => Ptr a -> Int 
ptrAlign1 _ = alignment (undefined :: a) 
+0

bu arkasındaki mantık nedir, bunları açıkça ölçmek sürece kapsamında koymak değil mi? –

+0

@ErikAllik: [El kitabı] (https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/other-type-extensions.html#scoped-type-variables) Var olan kodun davranışının sadece 'ScopedTypeVariables' özelliğini açarak değiştirmemesini bekliyorum. –