为什么注释lambda类型不需要-XScopedTypeVariables?

时间:2014-02-20 13:16:56

标签: haskell

这需要-XScopedTypeVariables

handle(\(_::SomeException) -> return Nothing)

但这不是

handle((\_ -> return Nothing)::SomeException -> IO (Maybe Integer))

如果::允许在函数体内注释类型,为什么需要pragma来注释局部变量?

1 个答案:

答案 0 :(得分:10)

更普遍的是:标准Haskell不允许在模式中签名,但允许任何表达式被赋予签名。以下都是有效的:

main :: IO ()
main = do
   x <- readLn
   print $ 5 + x

main' = (\y -> do {
   x <- readLn;
   print $ y + x } ) :: Int -> IO ()

main'' y = do
   x <- readLn :: IO Int
   print $ y + x :: IO ()

但这些都不是

main''' = do
   (x :: Int) <- readLn
   print $ 5 + x

main''' = (\(y :: Int) -> do {
   x <- readLn;
   print $ y + x } ) :: Int -> IO ()

main'''' (y :: Int) = do
   x <- readLn :: IO Int
   print $ y + x :: IO ()

显然,没有想到模式中的签名可能有用。但他们肯定是,所以ScopedTypeVariables引入了这种可能性。