web-dev-qa-db-ja.com

プログラムが括弧のみを出力する原因は何ですか?

キャリーセーブ加算器を実装するHaskellプログラムを作成しました。 type Nibble = (Bool, Bool, Bool, Bool)type Byte = (Nibble, Nibble)を定義しました。キャリーセーブ加算器の関数はcarrySaveAdder :: Byte -> Byte -> Byte -> ( Byte , Byte )です。タプルのバイトの1つを表示するために、バイトを2進数として表示できる小さな関数_showBin :: Byte -> String_を書きました。

この関数は、ghciでlet x = ((True,False,True,True),(False,False,False,False)) :: Byteなどの手動で定義した値を使用すると、完全に正常に機能します。タプルの要素の1つに適用しようとすると、期待した動作が実行されません。 2つの括弧または単一引用符のいずれかを出力し、キーボード入力に応答して、何らかのユーザー入力を待機しているように見せかけます。しかし、実際の長さを確認することはできませんが、長さを確認すると、8(予想どおり)のようです。

予想される出力は文字列としての8ビットの2進数ですが、実際の出力は引用符であり、手動で中断しない限り「出力」は停止しません。

この動作の考えられる理由は何でしょうか?

_type Nibble = (Bool, Bool, Bool, Bool)
type Byte = (Nibble, Nibble)

nand :: Bool -> Bool -> Bool
nand a b = not (a && b)

xor :: Bool -> Bool -> Bool
xor a b = nand( nand a (nand a b)) (nand b (nand a b))

fulladder :: Bool -> Bool -> Bool ->(Bool, Bool)
fulladder a b c =  (xor c (xor a b) , (a &&b) || ((xor a b) && c))

carrySaveAdder :: Byte -> Byte -> Byte -> ( Byte , Byte )
carrySaveAdder ((a0, a1, a2, a3),(a4,a5,a6,a7)) ((b0, b1, b2, b3),(b4,b5,b6,b7)) ((c0, c1, c2, c3),(c4,c5,c6,c7)) =
  let (r7,c7) = fulladder a7 b7 c7
      (r6,c6) = fulladder a6 b6 c6
      (r5,c5) = fulladder a5 b5 c5
      (r4,c4) = fulladder a4 b4 c4
      (r3,c3) = fulladder a3 b3 c3
      (r2,c2) = fulladder a2 b2 c2
      (r1,c1) = fulladder a1 b1 c1
      (r0,c0) = fulladder a0 b0 c0
    in (((r0,r1,r2,r3),(r4,r5,r6,r7)),((c0, c1, c2, c3),(c4,c5,c6,c7)))

showNib :: Nibble -> String
showNib (a,b,c,d) =  map showIndividual ([a,b,c,d])

showBin :: Byte -> String
showBin (a,b) =  showNib a ++ showNib b

showIndividual :: Bool -> Char
showIndividual a
                  | a =  '1'
                  | not a = '0'
_
_let x = ((True,False,True,True),(False,True,True,True)) :: Byte
let y = ((False,False,True,False),(False,True,True,True)) :: Byte
let z = ((False,False,True,False),(True,True,True,False)) :: Byte
let (sum,carry) = carrySaveAdder x y z
showBin carry
_
3
Liv M

あなたの問題はこの行にあります:

      (r0,c0) = fulladder a0 b0 c0

c0をそれ自体で定義しています。 GHCiがそれを表示するために評価しようとすると、無限ループに入ります。

そこにあるすべての行は、キャリービットに同じ循環依存関係を作成することに注意してください。それらは一緒に正しく配線されていません-キャリービットは、追加からnextへのキャリーであり、それ自体ではありません。

11
Carl