我一直在努力使用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
...