0

私は haskell が初めてで、型シグネチャに苦労しています。私は、単機能のコラッツ チェーン ジェネレーターに取り組んでいます。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

問題は、(/)float のような分数が必要であるのに対して、evenIntegralsoddが必要であるというevenことoddです。

2 番目のケースでは n が偶数であることがわかっているので、 に置き換える(/)quot、問題が解決します。

タイプは

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