這需要-XScopedTypeVariables
爲什麼註釋一個lambda類型不需要-XScopedTypeVariables?
handle(\(_::SomeException) -> return Nothing)
但這並不
handle((\_ -> return Nothing)::SomeException -> IO (Maybe Integer))
如果::
允許註解的類型內部函數體,爲什麼它需要一個附註註釋局部變量?
這需要-XScopedTypeVariables
爲什麼註釋一個lambda類型不需要-XScopedTypeVariables?
handle(\(_::SomeException) -> return Nothing)
但這並不
handle((\_ -> return Nothing)::SomeException -> IO (Maybe Integer))
如果::
允許註解的類型內部函數體,爲什麼它需要一個附註註釋局部變量?
更一般比:標準的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
介紹了這種可能性。
'_'是一個變量(參數),整個表達式('handle'參數)不是。您可以將類型簽名設置爲表達式。 – josejuan