我一直在努力使用System.Console.Terminfo. 我已经把mappend多个Capability放在一起了,但是每当我需要评估它们时,我必须使用getCapability然后使用 acase来对结果进行模式匹配Maybe。图案总是一样的
Just ... -> runTermOutput ...
Nothing -> return ()
所以我认为必须有更好的方法来做到这一点。在我看来,模式匹配正在替换Maybe为IO,所以我认为这可能是 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
...