代码之家  ›  专栏  ›  技术社区  ›  emi

Collatz函数中出现错误“No instance for(Num[t])”

  •  3
  • emi  · 技术社区  · 16 年前

    collatz n = (collatz' n) : 1
       where collatz' n = (takeWhile (>1) (collatz'' n))
              where collatz'' n = n : collatz'' (collatz''' n)
                     where collatz''' 1 = 1
                           collatz''' n = if (even n) then (div n 2) else ((3*2)+1)
    

    No instance for (Num [t])
      arising from the literal `2' at <interactive>:1:7
    Possible fix: add an instance declaration for (Num [t])
    

    我不知道这是什么意思。问题似乎是在列表后面加上了“1”。出现这个问题是因为

    collatz' n = (takeWhile (>0) (collatz'' n))
    

    在正确的Collatz序列之后生成一个“1”的无限序列;然而,

    collatz' n = (takeWhile (>1) (collatz'' n))
    

    从中生成所有Collatz编号

    3 回复  |  直到 16 年前
        1
  •  5
  •   Jacob    16 年前

    ony的回答是正确的,但既然你是Haskell的新手,也许这是一个更清楚的解释。这个 : 操作人员 之前 将值挂起到列表中,这样做 somelist : 7 美联社 将值挂起到列表。这就是为什么 (collatz' n) : 1 不编译,因为 (collatz' n)

    尝试更换 : 1 ++ [1] .

        2
  •  6
  •   ony    16 年前

    (:) :: a -> [a] -> [a]
    collatz n = (collatz' n) : 1 军队 1 成为 [a] .
    我猜你想要的是 (collatz' n) ++ [1]
    你在这方面有错误 if (even n) then (div n 2) else ((3*2)+1) 应该有 ((3*n)+1 或者其他类似的东西 collatz''' 7 = 7

        3
  •  0
  •   BMeph    16 年前

    span 使你自己的“takeUntil”功能。

    让我解释一下: span p xs 给你的答案和 (takeWhile p xs, dropWhile p xs) 无论哪一个 p 功能和 xs 列出你要用的,同样的方法 splitAt n xs 与相同 (take n xs, drop n xs) .

    要创建自己的“takeUntil”函数:

    takeUntil p xs = taken ++ take 1 dropped where
                     (taken, dropped) = span p xs
    

    collatz n = (collatz' n) : 1

    我希望这有帮助。

    推荐文章