使用`Control.Exception.catch'引起的

时间:2011-04-12 06:15:24

标签: haskell

当我加载haskell文件时,它有错误

module REPL(REPL(..), repl) where
import qualified Control.Exception as E
import System.Console.Readline(readline, addHistory)

data REPL s = REPL {
    repl_init :: IO (String, s),        -- prompt and initial state
    repl_eval :: s -> String -> IO (Bool, s),       -- quit flag and new state
    repl_exit :: s -> IO ()
    }

repl :: REPL s -> IO ()
repl p = do
    (prompt, state) <- repl_init p
    let loop s = (do
        mline <- readline prompt
        case mline of
        Nothing -> loop s
        Just line -> do
            (quit, s') <- repl_eval p s line
            if quit then
            repl_exit p s'
             else do
            addHistory line
            loop s'
        ) E.catch undefined (\(e :: E.SomeException) -> putStrLn "Handled exception!"
        )
    loop state

REPL.hs:21:5:
    Couldn't match expected type `IO (Maybe String)'
           against inferred type `t -> Maybe String'
    In a stmt of a 'do' expression: mline <- readline prompt
    In the expression:
        (do { mline <- readline prompt;
              case mline of {
                Nothing -> loop s
                Just line
                  -> do { (quit, s') <- repl_eval p s line;
                          .... } } })
          E.catch
          undefined
          (\ (e :: E.SomeException) -> putStrLn "Handled exception!")
    In the definition of `loop':
        loop s = (do { mline <- readline prompt;
                       case mline of {
                         Nothing -> loop s
                         Just line -> do { ... } } })
                   E.catch
                   undefined
                   (\ (e :: E.SomeException) -> putStrLn "Handled exception!")

2 个答案:

答案 0 :(得分:10)

通过在文件顶部包含此行来使用范围类型变量:

{-# LANGUAGE ScopedTypeVariables #-}

或者在GHCi会议中做:

> :set -XScopedTypeVariables

并在你的catch函数中提供签名。在GHCi:

> import Control.Exception as E
> E.catch undefined (\(e :: E.SomeException) -> putStrLn "Handled exception!")
Handled exception!

庆祝美好时光,加油!

答案 1 :(得分:2)

有助于查看给您带来麻烦的实际代码,但请参阅下面的示例,了解您描述的问题以及通过添加类型签名解决该示例。在ghci:

> :m + Control.Exception
> print "hello world" `Control.Exception.catch` (\_ -> print "goodby world")

<interactive>:1:21:
    Ambiguous type variable `e' in the constraint:
      (Exception e) arising from a use of `Control.Exception.catch'
    Probable fix: add a type signature that fixes these type variable(s)
    In the expression:
        print "hello world"
      `Control.Exception.catch`
        (\ _ -> print "goodby world")
    In an equation for `it':
        it
          = print "hello world"
          `Control.Exception.catch`
            (\ _ -> print "goodby world")
> print "hello world" `Control.Exception.catch` ((\_ -> print "goodby world") :: IOException -> IO ())
"hello world"

关键是catch表达式(\_ -> print "goodby world")不限制其参数的类型。我希望你有类似的问题。