0

我一直在努力使用System.Console.Terminfo. 我已经把mappend多个Capability放在一起了,但是每当我需要评估它们时,我必须使用getCapability然后使用 acase来对结果进行模式匹配Maybe。图案总是一样的

Just ... -> runTermOutput ...
Nothing -> return ()

所以我认为必须有更好的方法来做到这一点。在我看来,模式匹配正在替换MaybeIO,所以我认为这可能是 monad 转换器的用途。看Capability定义,

> :i Capability
newtype Capability a
  = System.Console.Terminfo.Base.Capability (Terminal
                                             -> IO (Maybe a))
...

它看起来确实与MaybeT我在 StackOverflow 上找到的示例相似,但它是一个函数这一事实让我感到震惊。(另外,仅阅读一个示例后,我不能声称理解 monad 转换器。)

我在正确的轨道上吗?有没有不同的模式可以帮助我避免case一遍又一遍地写这个?

这是getCapability类型:

> :i getCapability 
getCapability :: Terminal -> Capability a -> Maybe a
...
4

2 回答 2

1
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_andforfor_and traverseand traverse_

于 2016-04-18T08:07:51.657 回答
0

据我了解,Terminfo Capability接口意味着 monad 转换器不是答案。

正如user2407038建议的那样,case可以使用该功能避免该模式,

\t -> maybe (return ()) (runTermOutput t) . (getCapability t)
  :: Terminal -> Capability TermOutput -> IO ()
于 2016-04-22T04:18:27.380 回答