[Haskell-beginners] type error in sub-function
James Toll
james at jtoll.com
Sat Feb 15 19:42:15 UTC 2014
Hi,
I am trying to write a simple function to determine the divisors of an integer. In its simplest form the type signature should be something like:
divisors :: Int -> [Int]
divisors x = 1 : lower ++ upper ++ x : []
where lower = filter (\y -> mod x y == 0) [2..(ceiling . sqrt) x]
upper = sort $ map (div x) lower
Although, I think my type signature isn’t complete as it ignores a lot of what’s going on in the function. Regardless, the function throws an error when evaluated. I don’t know if I just need a more accurate type signature, or if there is a bigger problem.
From what I can tell, my problem is in the lower function, but when I deconstruct it into its parts, they work individually and as a whole, but not as a stand-alone function. For example, using x = 36:
Prelude> [2..(ceiling . sqrt) 36]
[2,3,4,5,6]
Prelude> filter (\y -> mod 36 y == 0) it
[2,3,4,6]
Or as a whole:
Prelude> filter (\y -> mod 36 y == 0) [2..(ceiling . sqrt) 36]
[2,3,4,6]
But when I define this as a function, it throws an error when evaluated.
Prelude> let lower x = filter (\y -> mod x y == 0) [2..(ceiling . sqrt) x]
Prelude> lower 36
<interactive>:6:1:
No instance for (RealFrac b0) arising from a use of `lower'
The type variable `b0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there are several potential instances:
instance RealFrac Double -- Defined in `GHC.Float'
instance RealFrac Float -- Defined in `GHC.Float'
instance Integral a => RealFrac (GHC.Real.Ratio a)
-- Defined in `GHC.Real'
In the expression: lower 36
In an equation for `it': it = lower 36
<interactive>:6:7:
No instance for (Num b0) arising from the literal `36'
The type variable `b0' is ambiguous
Possible fix: add a type signature that fixes these type variable(s)
Note: there are several potential instances:
instance Num Double -- Defined in `GHC.Float'
instance Num Float -- Defined in `GHC.Float'
instance Integral a => Num (GHC.Real.Ratio a)
-- Defined in `GHC.Real'
...plus three others
In the first argument of `lower', namely `36'
In the expression: lower 36
In an equation for `it': it = lower 36
At this point, I’m not sure what I need to do to get his working properly. It appears to be a type error, but I’m apparently not understanding the error message enough to fix the problem. Any suggestions would be appreciated.
Thanks,
James
More information about the Beginners
mailing list