我找不到addWithCarry :: Word8 -> Word8 -> (Word8, Bool)
中已定义的函数base
。在addIntC#
中,记录为关注载体的唯一函数似乎是GHC.Prim
,但它似乎永远不会被推向各种抽象层。
我显然可以通过测试输出值是否在范围内并且实际上是我正在进行的操作来推出自己的产品,但我宁愿重复使用(可能更有效)已经定义的产品。
有这样的事吗?
答案 0 :(得分:2)
如果您查看the source for Word8's Num instance,您会看到所有内容都是通过转换为Word#
未装箱的值并对其执行操作,然后缩小到8位值来完成的。 。我怀疑对Word#
值进行比较会更有效率,所以我实现了这样的事情。它是available on lpaste(我发现它比StackOverflow更容易阅读)。
请注意,它包括测试套件和Criterion基准。在我的系统上,所有各种测试对于盒装版本(user5402' s实现)需要~31ns,对于primops版本需要~24ns。
上述lpaste的重要功能是primops
,即:
primops :: Word8 -> Word8 -> (Word8, Bool)
primops (W8# x#) (W8# y#) =
(W8# (narrow8Word# z#), isTrue# (gtWord# z# 255##))
where
z# = plusWord# x# y#
答案 1 :(得分:0)
执行此操作的方法是:
addWithCarry :: Word8 -> Word8 -> (Word8, Bool)
addWithCarry x y = (z, carry)
where z = x + y
carry = z < x