我一直在努力用System.Console.Terminfo简化一个小程序。我已经把多个mappend放在一起了,但是每当我需要对它们进行评估时,我就必须使用getCapability,然后使用case来匹配结果的Maybe。模式总是一样的
Just ... -> runTermOutput ...
Nothing -> return ()所以我认为一定有更好的方法来做到这一点。在我看来,模式匹配正在用IO取代IO,所以我想这可能就是单台变压器的用途。看看Capability的定义,
> :i Capability
newtype Capability a
= System.Console.Terminfo.Base.Capability (Terminal
-> IO (Maybe a))
...它看起来确实类似于我在MaybeT上找到的StackOverflow示例,但是它是一个函数的事实使我无法理解。(另外,我读了一个例子后,也不能声称理解单台变压器。)
我在正确的轨道上吗?有什么不同的模式可以帮助我避免一遍又一遍地写这个case吗?
下面是getCapability类型:
> :i getCapability
getCapability :: Terminal -> Capability a -> Maybe a
...发布于 2016-04-22 04:18:27
据我所知,Terminfo Capability接口意味着单台变压器不是答案。
正如user2407038所建议的,使用该函数可以避免case模式,
\t -> maybe (return ()) (runTermOutput t) . (getCapability t)
:: Terminal -> Capability TermOutput -> IO ()发布于 2016-04-18 08:07:51
mapM :: (Monad m, Traversable t) => (a -> m b) -> t a -> m (t b)专长不仅是
mapM :: (a -> IO b) -> [a] -> IO [b],但也是
mapM :: (a -> IO b) -> Maybe a -> IO (Maybe b)。mapM_和for、for_、traverse和traverse_也是如此。
https://stackoverflow.com/questions/36684189
复制相似问题