0

我是 haskell 的新手,并且在类型签名上苦苦挣扎。我正在研究单功能 Collat​​z 链生成器。我看过一些haskell collat​​z问题,但没有看到任何回答我试图回答的问题。我正在使用 GHCI。

这是我的功能:

collatz :: (Num a) => a -> [a]
collatz n 
    | n == 1  = [n]
    | odd n   = n : collatz (n * 3 + 1)
    | even n  = n : collatz (n / 2)

看起来这应该是直截了当的;它应该只是将新的转换附加到列表中。但是,解释器给了我这些错误:

collatz.hs:9:13:
  Could not deduce (Eq a) arising from a use of `=='
  from the context (Num a)
....
collatz.hs:10:11:
  Could not deduce (Integral a) arising from a use of `odd'
  from the context (Num a)
....
collatz.hs:11:36:
  Could not deduce (Fractional a) arising from a use of `/'
  from the context (Num a)

编译器告诉我使用的类型签名的每种组合似乎都失败了

collatz :: (Eq a, Num a) => a -> [a]
collatz :: (Integral a) => a -> [a]
collatz :: (Fractional a) => a -> [a]

我显然错过了一些基本的东西。谁能告诉我如何制作具有单一功能的 collat​​z 链?

4

1 回答 1

3

问题是,(/)需要像浮点数一样的分数,而even需要odd积分......基本上,和的概念对even分数odd没有意义(即 - 是 1.5 奇数还是偶数?)。

由于您知道 n 在第二种情况下是偶数,因此您可以替换(/)quot,这将解决问题。

类型将是

collatz :: Integral a => a -> [a]
于 2014-12-17T06:41:34.740 回答