ib123456
ib123456

Reputation: 3

why do I get a type error here?

I'm sitting on this for over 4 hours and can't wrap my head aroud it. I try to run the following code:

top = 100 :: Int

couplesToOne num
    |num<0            = error "num<0"
    |num==0           = 0
    |num `mod` 2 == 0 = num `div` 2
    |num `mod` 2 == 1 = (num+1) `div` 2
    |otherwise        = error "otherwise"

numInBig n bigSide 
    |(bigSide^2 <= n) = couplesToOne (n-1)  
    |(bigSide^2 >  n) = couplesToOne (n-1) - (couplesToOne (floor(sqrt(bigSide^2 - n))))
    |otherwise        = error "otherwise"

ans = map (numInBig top) [3..((div top 4) + 1)]

and I get the following error message:

No instance for (RealFrac Int) arising from a use of `numInBig'
In the first argument of `map', namely `(numInBig top)'
In the expression: map (numInBig top) [3 .. ((div top 4) + 1)]
In an equation for `ans':
    ans = map (numInBig top) [3 .. ((div top 4) + 1)]
    enter code here

I figured out (probably?) that this is because of the "sqrt" that returns a float but that's why I added the floor that's supposed to return an Integral.

can you please help me?

Upvotes: 0

Views: 73

Answers (1)

lodrik
lodrik

Reputation: 472

This works:

top = 100 :: Int

couplesToOne num
    |num<0            = error "num<0"
    |num==0           = 0
    |num `mod` 2 == 0 = num `div` 2
    |num `mod` 2 == 1 = (num+1) `div` 2
    |otherwise        = error "otherwise"

numInBig n bigSide 
    |(bigSide^2 <= n) = couplesToOne (n-1)  
    |(bigSide^2 >  n) = couplesToOne (n-1) - couplesToOne (floor(sqrt(fromIntegral(bigSide^2 - n))))
    |otherwise        = error "otherwise"

ans = map (numInBig top) [3..((div top 4) + 1)]

You need an extra fromIntegral because sqrt::Floating a => a -> a is not defined on Int.

> ans
[50,50,50,50,50,50,50,50,48,47,46,45,44,44,43,43,42,41,41]

Upvotes: 3

Related Questions