Haskell 带有IO字符串的readInputLine
我想用自定义提示读取输入字符串,但是提示字符串来自不纯的上下文,因此我不能按原样使用Haskell 带有IO字符串的readInputLine,haskell,monads,monad-transformers,haskeline,Haskell,Monads,Monad Transformers,Haskeline,我想用自定义提示读取输入字符串,但是提示字符串来自不纯的上下文,因此我不能按原样使用readInputLine。我试图实现一个基于 getLineIO::MonadException m=>IO字符串->输入m(可能是字符串) getLineIO ios=do s IO字符串->输入m(可能是字符串) getLineIO ios=do s代码 do s <- ios res <- getInputLine s lift res 在哪里 此类型签名意味着m必须
readInputLine
。我试图实现一个基于
getLineIO::MonadException m=>IO字符串->输入m(可能是字符串)
getLineIO ios=do
s IO字符串->输入m(可能是字符串)
getLineIO ios=do
s代码
do
s <- ios
res <- getInputLine s
lift res
在哪里
此类型签名意味着m
必须始终是相同的Monad
实例。您已经给了它ios::IO String
和\s->getInputLines::String->input n(可能是String)
,但是m
不能同时是IO
和input n
,因此编译器错误
只要定义了实例MonadIO m=>MonadIO(input m)
,就可以在ios
上使用liftIO
。所以你可以这么做
getLineIO :: (MonadException m) => IO String -> InputT m (Maybe String)
getLineIO ios = do
s <- liftIO ios
res <- getInputLine s
lift res
getLineIO::(MonadException m)=>IO字符串->输入m(可能是字符串)
getLineIO ios=do
s代码
do
s <- ios
res <- getInputLine s
lift res
在哪里
此类型签名意味着m
必须始终是相同的Monad
实例。您已经给了它ios::IO String
和\s->getInputLines::String->input n(可能是String)
,但是m
不能同时是IO
和input n
,因此编译器错误
只要定义了实例MonadIO m=>MonadIO(input m)
,就可以在ios
上使用liftIO
。所以你可以这么做
getLineIO :: (MonadException m) => IO String -> InputT m (Maybe String)
getLineIO ios = do
s <- liftIO ios
res <- getInputLine s
lift res
getLineIO::(MonadException m)=>IO字符串->输入m(可能是字符串)
getLineIO ios=do
s您可能只需要使用lift
将IO字符串
转换为Input IO字符串
,即s您可能只需要使用lift
将IO字符串
转换为Input IO字符串
,即s谢谢,您是否同时对MonadException
和MonadIO
使用m
?@dimidliftIO
要求您所在的Monad
也实现MonadIO
。查看后,似乎MonadException
已经需要MonadIO
,因此您可以放弃该要求。但是,如果您在不同的Monad
中工作,则可能对特定的m
有多个约束。看到基于mtl
的代码带有(MonadState s m、MonadWriter w m、MonadIO m)=>…
谢谢,您是否同时对MonadException
和MonadIO
使用m
?@dimidliftIO
要求您所在的Monad
也实现MonadIO
。查看后,似乎MonadException
已经需要MonadIO
,因此您可以放弃该要求。但是,如果您在不同的Monad
中工作,则可能对特定的m
有多个约束。看到基于mtl
的代码具有(MonadState s m、MonadWriter w m、MonadIO m)=>…
ios >>= \s -> (getInputLine s >>= \res -> lift res)
(>>=) :: Monad m => m a -> (a -> m b) -> m b
getLineIO :: (MonadException m) => IO String -> InputT m (Maybe String)
getLineIO ios = do
s <- liftIO ios
res <- getInputLine s
lift res