这需要-XScopedTypeVariables
handle(\(_::SomeException) -> return Nothing)
但这不是
handle((\_ -> return Nothing)::SomeException -> IO (Maybe Integer))
如果::
允许在函数体内注释类型,为什么需要pragma来注释局部变量?
答案 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
引入了这种可能性。