(-2)adian 运行。但是对于 (-2)adian -> 小-6ren">
gpt4 book ai didi

haskell - 在 Haskell 中将负基二进制转换为十进制 : "Instances of .. required"

转载 作者:行者123 更新时间:2023-12-02 10:18:35 24 4
gpt4 key购买 nike

我必须编写两个函数,将十进制数字转换为 (-2)adian 数字系统(类似于仅使用 -2 的二进制),反之亦然。我已经设法让小数 -> (-2)adian 运行。但是对于 (-2)adian -> 小数我有一个问题,只是不知道从哪里开始。希望你能帮助我

type NegaBinary = String

-- Function (-2)adisch --> decimal
negbin_dezi :: NegaBinary -> Integer -> Integer
negbin_dezi (xs:x) n
| (x == 0) = if ([xs] == "") then 0 else (negbin_dezi [xs] (n+1))
| (x == 1) = if ([xs] == "") then (-2)**n else (-2)**n + (negbin_dezi [xs] (n+1))

它总是抛出:“定义 negbin_dezi 需要 (Num [Char], Floating Integer) 实例。

有人知道为什么它不起作用吗?请拜托拜托:)

最佳答案

您的列表模式匹配语法是向后的。在 _ : _第一个参数是列表的头部(一个元素),第二个参数是列表的尾部(另一个列表)。例如x:xs"abc" 匹配给出x = 'a' xs = "bc" 。所以xs:x应该是x:xs 。 GHC 要求 instance of Num [Char] 的原因,是比较x == 0 (和x == 1)。在此,它试图匹配 x 的类型。 ( String == [Char] ) 类型为 0 ( Num a => a ),为此,需要 Num String 的实例.

修复是:negbin_dezi (x:xs) n

请求 Floating Integer 的问题实例是因为(**)类型为Floating a => a -> a -> a ,随心所欲(^)其类型为 (Num a, Integral b) => a -> b -> a (即它仅限于整数幂。)

完成此操作后,您会发现您的算法由于以下几个原因不起作用:

  • 数字 0 与字符 '0' 不同,你应该比较 x与字符 '0''1'而不是数字01 .
  • xs已经是一个字符串,所以 [xs]是一个包含字符串的列表,这不是您想要的。这是通过删除方括号来修复的。
  • 可能减少的顺序是错误的。
<小时/>

另一方面,重复的 if声明表明您的代码可能会发生一些优化。具体来说,如果您将空字符串处理为 negbin_dezi 的一部分那么你就不必对其进行特殊处理。你可以这样写

negbin_dezi "" _ = 0
negbin_dezi (x:xs) n
| n == '0' = negbin_dezi xs (n+1)
| n == '1' = (-2)^n + negbin_dezi

(这意味着该函数“更全面”,即它是在更多输入上定义的。)

还有一些事情:

  • 代码是“字符串类型”:您的数据被表示为字符串,尽管具有更多结构。 bool 值列表 ( [Bool] ) 会好得多。
  • 该算法可以调整得更干净。对于以下内容,我假设您将其存储为 "01" = -2 "001" = 4等等。如果是这样,那么我们知道number = a + (-2) * b + (-2)^2 * c ... = a + (-2) * (b + (-2) * (c + ...))哪里a , b , c ,... 是数字。看看这个,我们可以看到括号内的内容实际上与整个表达式相同,只是从第二个数字开始。这在 Haskell 中很容易表达(我正在使用 bool 列表的想法。):

    negbin [] = 0
    negbin (x:xs) = (if x then 1 else 0) + (-2) * negbin xs

    这就是整个事情。如果您不按该顺序存储它,则调用 reverse解决这个问题! (真的很棘手,可以写

    negbin = foldr (\x n -> (if x then 1 else 0) + (-2)*n) 0

    )

关于haskell - 在 Haskell 中将负基二进制转换为十进制 : "Instances of .. required",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13259130/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com