我找不到 addWithCarry :: Word8 -> Word8 -> (Word8, Bool)
中已经定义的函数 base
。唯一记录为关心进位的函数似乎是 addIntC#
中的 GHC.Prim
但它似乎永远不会通过各种抽象层向上推。
我显然可以通过测试输出值是否在范围内来推出我自己的,这实际上是我目前正在做的,但我宁愿重用一个(可能更有效)已经定义的。
有这样的事情吗?
最佳答案
如果您查看 the source for Word8's Num instance ,您会发现一切都是通过转换为 Word#
未装箱值并对其执行操作,然后缩小到 8 位值来完成的。我怀疑对 Word#
值进行比较会更有效,所以我实现了这样的事情。它是 available on lpaste(我发现它比 StackOverflow 更容易阅读)。
请注意,它包括测试套件和 Criterion 基准测试。在我的系统上,所有各种测试对于盒装版本(user5402 的实现)需要 ~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#
关于haskell - 添加与进行 Word8,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27204425/