使用 Haskeline 的 getInputLine 的输入
Use the input from Haskeline's getInputLine
我有密码
main :: IO()
main = runInputT defaultSettings loop
where
--loop :: InputT IO ()
loop = do
minput <- getInputLine "$ "
case minput of
Nothing -> return ()
Just input -> process $ words input
loop
其中进程具有类型定义
process :: [String] -> IO ()
但是我收到错误:
• Couldn't match type ‘IO’ with ‘InputT m’
Expected type: InputT m ()
Actual type: IO ()
• In the expression: process $ words input
In a case alternative: Just input -> process $ words input
In a stmt of a 'do' block:
case minput of {
Nothing -> return ()
Just input -> process $ words input }
我想知道是否有人可以解释我做错了什么。
我只想使用 getInputLine 的原始输入来做其他事情。
谢谢
do
块中的所有语句必须具有相同的类型(好吧,它们的类型必须具有相同的 monad)。在你的例子中,这是 InputT IO something
(monad 是 InputT IO
)。
getInputLine "$ "
的类型是 InputT IO (Maybe String)
,所以那部分没问题。
然后你有一个 case
表达式,这意味着所有分支都需要具有相同的类型。第一个分支只是 return ()
,其类型为 InputT IO ()
。目前一切顺利。
第二个分支是process $ words input
。但这具有类型 IO ()
,而不是 InputT IO ()
,这是编译器此时所期望的。
要解决此问题:幸运的是,有一种简单的方法可以将 IO x
类型的值转换 ("lift") 为 InputT IO x
,即 liftIO
函数:
Just input -> liftIO (process $ words input)
也就是liftIO :: IO a -> InputT IO a
(其实比那个更笼统:liftIO :: (MonadIO m) => IO a -> m a
不过这里没关系)
我有密码
main :: IO()
main = runInputT defaultSettings loop
where
--loop :: InputT IO ()
loop = do
minput <- getInputLine "$ "
case minput of
Nothing -> return ()
Just input -> process $ words input
loop
其中进程具有类型定义
process :: [String] -> IO ()
但是我收到错误:
• Couldn't match type ‘IO’ with ‘InputT m’
Expected type: InputT m ()
Actual type: IO ()
• In the expression: process $ words input
In a case alternative: Just input -> process $ words input
In a stmt of a 'do' block:
case minput of {
Nothing -> return ()
Just input -> process $ words input }
我想知道是否有人可以解释我做错了什么。 我只想使用 getInputLine 的原始输入来做其他事情。
谢谢
do
块中的所有语句必须具有相同的类型(好吧,它们的类型必须具有相同的 monad)。在你的例子中,这是 InputT IO something
(monad 是 InputT IO
)。
getInputLine "$ "
的类型是 InputT IO (Maybe String)
,所以那部分没问题。
然后你有一个 case
表达式,这意味着所有分支都需要具有相同的类型。第一个分支只是 return ()
,其类型为 InputT IO ()
。目前一切顺利。
第二个分支是process $ words input
。但这具有类型 IO ()
,而不是 InputT IO ()
,这是编译器此时所期望的。
要解决此问题:幸运的是,有一种简单的方法可以将 IO x
类型的值转换 ("lift") 为 InputT IO x
,即 liftIO
函数:
Just input -> liftIO (process $ words input)
也就是liftIO :: IO a -> InputT IO a
(其实比那个更笼统:liftIO :: (MonadIO m) => IO a -> m a
不过这里没关系)