0

を使用して小さなプログラムを単純化するのに苦労していSystem.Console.Terminfoます。mappend複数をまとめることまではCapabilityできましたが、それらを評価する必要があるときはいつでも、getCapabilityacaseを使用してから、結果のMaybe. いつも同じパターン

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

ですから、これを行うためのより良い方法が必要だと思います。パターンマッチングが に置き換わっているように見えるMaybeのでIO、モナドトランスフォーマーの目的ではないかと思いました。Capability定義を見ると、

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

MaybeTここで StackOverflow で見つけた例と似ていますが、関数であるという事実は私を混乱させます。(さらに、例を 1 つ読んだだけでは、モナド変換子を理解しているとは言えません。)

私は正しい軌道に乗っていますか?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_and forand for_and and traverseandについても同様traverse_です。

于 2016-04-18T08:07:51.657 に答える
0

私が理解していることから、Terminfo Capabilityインターフェースはモナドトランスフォーマーが答えではないことを意味します。

user2407038 が提案しcaseたように、関数でパターンを回避できます。

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