1

次の定型コードを削減したいと思いますが、レンズ (Data.Label) を使用しません。どうすればこれを行うのが最善でしょうか?

data Qcfg = Qcfg { qthresh :: Int, tdelay :: Rational, cwpsq :: TPSQ, cwmap :: TMap, cwchan :: TChan String }

getQthresh = do
   c <- ask
   return (qthresh c)

getDelay = do
   c <- ask
   return (tdelay c)

getTMap = do
   c <- ask
   return (cwmap c)

getTPsq = do
   c <- ask
   return (cwpsq c)

getTChan = do
    c <- ask
    return (cwchan c)
4

1 に答える 1

8

これらはfmapの単なるケースです。これらはすべて同等です。

getQthresh = qthresh <$> ask

getQthresh'' = fmap qthresh ask

getQthresh''' = liftM qthresh ask

getQthresh' = do
   c <- ask
   return (qthresh c)

Data.Functor/Control.Applicativeバージョンは<$>あなたが望むものです。考えてみれば、定型文はまったくありません。そして、あなたは確かに各アクセサーのスペース書き込み機能を浪費しています。あなたはあなたに与えるアクセサーを適用するための新しい方法です。fmap/<$>あなたが永遠に書いているなら、<$> askあなたは定義することができます

 get field = field <$> ask

多分それは私がそれを考えるとあなたが今探していたものです。それで

get qthresh

あなたと同じになります

getQthresh

他のフィールドについても同様です。もちろん、これを単調な方法で定義することもできますget(Stateは別の状態になることに注意してください)。

get field = do
   c <- ask
   return (field c)

ある特定のケースについてはReader、そして同様にですが、私は、アクセサーをファンクターまたはモナドに「持ち上げる」ことについての質問をしていました。asks ffmap f askgetsStatedo {x <- action; return (f x)}f <$> action

于 2012-06-19T13:43:29.163 に答える