是什么导致我的程序只打印括号?

What is causing my program to only print parentheses?

我写了一个 Haskell 程序,我想在其中实现一个进位保存加法器。我定义了 type Nibble = (Bool, Bool, Bool, Bool)type Byte = (Nibble, Nibble)。进位保存加法器的功能是carrySaveAdder :: Byte -> Byte -> Byte -> ( Byte , Byte )。为了显示元组中的一个字节,我写了一个小函数 showBin :: Byte -> String 可以将字节显示为二进制数。

如果在 ghci 中使用我在其中手动定义的值(例如 let x = ((True,False,True,True),(False,False,False,False)) :: Byte),此函数将完全正常工作。一旦我尝试将它应用于元组的元素之一,它就不会执行预期的行为。它打印 两个括号 单引号 并响应键盘输入,这使得它看起来像是在等待某种用户输入。如果我检查它的长度,虽然我看不到实际输出,但它似乎是 8(如预期的那样)。

预期的输出将是一个 8 位二进制数作为字符串,但实际输出是一个引号并且 "output" 不会停止,除非我手动中断它。

这种行为的可能原因是什么?

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

您的问题出在这一行:

      (r0,c0) = fulladder a0 b0 c0

您是根据自身定义值 c0。当 GHCi 试图评估它以显示它时,它会进入无限循环。

请注意,其中的每一行都在其进位位中创建了相同的循环依赖关系。它们没有正确连接在一起 - 一个进位应该从加法进位到 下一个,而不是它本身。