当我加载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!")
答案 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")
不限制其参数的类型。我希望你有类似的问题。