Haskell ScopedTypeVariables不';t将类型变量引入范围

Haskell ScopedTypeVariables不';t将类型变量引入范围,haskell,ghc,type-variables,Haskell,Ghc,Type Variables,下面是一个返回指针对齐方式的简单函数: {-# LANGUAGE ScopedTypeVariables #-} import Foreign.Ptr (Ptr) import Foreign.Storable (Storable, alignment) main = return () ptrAlign1 :: (Storable a) => Ptr a -> Int ptrAlign1 _ = alignment (undefined :: a) 但我得到了以下错误:

下面是一个返回指针对齐方式的简单函数:

{-# LANGUAGE ScopedTypeVariables #-}

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

main = return ()

ptrAlign1 :: (Storable a) => Ptr a -> Int
ptrAlign1 _ = alignment (undefined :: a) 
但我得到了以下错误:

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
如果我在一个更混乱的阵营中重写
ptrAlign
,就像这样:

ptrAlign2 :: (Storable a) => Ptr a -> Int
ptrAlign2 = ptrAlign3 undefined where
  ptrAlign3 :: (Storable a) => a -> Ptr a -> Int
  ptrAlign3 x _ = alignment x
它工作正常(当然,这个版本甚至不需要
ScopedTypeVariables


但我仍然很好奇为什么第一个版本会抛出错误,以及可以做些什么来解决它?

即使启用了
ScopedTypeVariables
,类型变量也不会放入范围,除非您显式量化它们,即

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

这背后的基本原理是什么?@ErikAllik:没有说,但我认为这是为了使现有代码不会因为打开
ScopedTypeVariables
而改变其行为。