2014-02-20 92 views
6

這需要-XScopedTypeVariables爲什麼註釋一個lambda類型不需要-XScopedTypeVariables?

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

但這並不

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

如果::允許註解的類型內部函數體,爲什麼它需要一個附註註釋局部變量?

+0

'_'是一個變量(參數),整個表達式('handle'參數)不是。您可以將類型簽名設置爲表達式。 – josejuan

回答

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介紹了這種可能性。

+1

這是'表達式類型簽名'http://www.haskell.org/onlinereport/exps.html#sect3.16? – Sawyer

+0

@Sawyer是的。 – AndrewC

相關問題