週に一回は書きますよ 月に4つ記事を書けばノルマは満たされます。
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
解答編です。Arrow Circuit 1 by oxyさんの回路に、計算中に回路名を表示する機能をつけてみました。
type IOArrow = Kleisli IO

--aの実行前に nameを表示するArrow
addName :: Show b => String -> IOArrow b c -> IOArrow b c
addName name a = Kleisli act where
    act x = do
        putStrLn $ name++" "++show x
        runKleisli a x

--上記の関数版.
namedGate :: Show b => String -> (b -> c) -> IOArrow b c
namedGate str f = addName str $ arr f

namedOr = addName "OR" $ arr orGate
namedAnd = addName "AND" $ arr andGate
namedInv = addName "NOT" $ arr inverter

halfAdder :: IOArrow (Bool,Bool) (Bool,Bool)
halfAdder = addName "HalfAdder" $
            proc (a,b) -> do
              d <- namedOr -< (a,b)
              c <- namedAnd -< (a,b)
              e <- namedInv -< c
              s <- namedAnd -< (d,e)
              returnA -< (s,c)

fullAdder :: IOArrow (Bool,Bool,Bool) (Bool,Bool)
fullAdder = addName "FullAdder" $
            proc (a,b,cIn) -> do
                (s2,c2) <- halfAdder -< (b,cIn)
                (s1,c1) <- halfAdder -< (a,s2)
                cOut <- namedOr -< (c1,c2)
                returnA -< (s1,cOut)

main :: IO ()
main = do
        ans <- runKleisli fullAdder (True,True,True)
        putStrLn $ "Answer = " ++ show ans
出力結果です。
FullAdder (True,True,True)
HalfAdder (True,True)
OR (True,True)
AND (True,True)
NOT True
AND (True,False)
HalfAdder (True,False)
OR (True,False)
AND (True,False)
NOT False
AND (True,True)
OR (False,True)
Answer = (True,True)

やったできました。

次はこの出力にインデントをつけましょう。

スポンサーサイト
コメント
この記事へのコメント
コメントを投稿する
URL:
Comment:
Pass:
秘密: 管理者にだけ表示を許可する
 
トラックバック
この記事のトラックバックURL
http://gusmachine.blog49.fc2.com/tb.php/21-eb46d08f
この記事にトラックバックする(FC2ブログユーザー)
この記事へのトラックバック
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。