首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确使用Terminfo的能力类型。单台变压器是答案吗?

如何正确使用Terminfo的能力类型。单台变压器是答案吗?
EN

Stack Overflow用户
提问于 2016-04-18 01:37:25
回答 2查看 58关注 0票数 0

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

代码语言:javascript
复制
Just ... -> runTermOutput ...
Nothing -> return ()

所以我认为一定有更好的方法来做到这一点。在我看来,模式匹配正在用IO取代IO,所以我想这可能就是单台变压器的用途。看看Capability的定义,

代码语言:javascript
复制
> :i Capability
newtype Capability a
  = System.Console.Terminfo.Base.Capability (Terminal
                                             -> IO (Maybe a))
...

它看起来确实类似于我在MaybeT上找到的StackOverflow示例,但是它是一个函数的事实使我无法理解。(另外,我读了一个例子后,也不能声称理解单台变压器。)

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

下面是getCapability类型:

代码语言:javascript
复制
> :i getCapability 
getCapability :: Terminal -> Capability a -> Maybe a
...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-22 04:18:27

据我所知,Terminfo Capability接口意味着单台变压器不是答案。

正如user2407038所建议的,使用该函数可以避免case模式,

代码语言:javascript
复制
\t -> maybe (return ()) (runTermOutput t) . (getCapability t)
  :: Terminal -> Capability TermOutput -> IO ()
票数 0
EN

Stack Overflow用户

发布于 2016-04-18 08:07:51

代码语言:javascript
复制
mapM :: (Monad m, Traversable t) => (a -> m b) -> t a -> m (t b)

专长不仅是

代码语言:javascript
复制
mapM :: (a -> IO b) -> [a] -> IO [b]

,但也是

代码语言:javascript
复制
mapM :: (a -> IO b) -> Maybe a -> IO (Maybe b)

mapM_forfor_traversetraverse_也是如此。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36684189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档