urig
urig

Reputation: 16841

Ambiguous type variable `a0' arising from a use of `print'?

While learning Haskell I'm trying to write a function that given a number will give its successor in a Collatz sequence:

next :: (Fractional a, Integral a) => a -> a
next x
    | odd x = x * 3 + 1
    | otherwise = x / 2

When I run next 7 I get:

<interactive>:150:1: error:
* Ambiguous type variable `a0' arising from a use of `print'
  prevents the constraint `(Show a0)' from being solved.
  Probable fix: use a type annotation to specify what `a0' should be.
  These potential instances exist:
    instance Show Ordering -- Defined in `GHC.Show'
    instance Show Integer -- Defined in `GHC.Show'
    instance Show a => Show (Maybe a) -- Defined in `GHC.Show'
    ...plus 22 others
    ...plus 12 instances involving out-of-scope types
    (use -fprint-potential-instances to see them all)
* In a stmt of an interactive GHCi command: print it

Two questions:

  1. Am I using the best class constraints in my signature?
  2. Assuming I am, how can I show the result of next 7 ?

Upvotes: 2

Views: 6193

Answers (1)

bzim
bzim

Reputation: 1070

I believe Collatz sequence is an integer sequence, so it wouldn't be necessary making the result Fractional.

next :: (Integral a) => a -> a

To be able to get an integer from a division, you should use div function. Note that division will always be exact as you are going to divide only even numbers:

next x
    | odd x = x * 3 + 1
    | otherwise = x `div` 2

Upvotes: 1

Related Questions