On Sep 5, 2007, at 21:10 , Tomi Owens wrote:
Prelude> let f (a,b) = a * floor (100000/b)
Prelude> f(2,5)
40000
This function works just as I want it to.
Now I try creating a list:
Prelude> [(a2+b2,a)| a <- [1..4] , b<- [1..4], a2+b2<20, b<=a]
[(2,1),(5,2),(8,2),(10,3),(13,3),(18,3),(17,4)]
and this works
So now I try to apply the function to the list:
Prelude> map (f) [(a2+b2,a)| a <- [1..4] , b<- [1..4], a2+b2<20, b<=a]
and I get this result:
<interactive>:1:5:
Ambiguous type variable `t' in the constraints:
`Integral t' arising from use of `f' at <interactive>:1:5
`RealFrac t' arising from use of `f' at <interactive>:1:5
Probable fix: add a type signature that fixes these type variable
(s)
I'm sorry, but I don't quite get how to set the type signature and
how it will apply to my function...
The problem here is that (assuming the a\sup{2} etc. are actually
a^2) the (^) operator expects and returns Integrals, but (/) requires
a RealFrac. Thus, the type of your list comprehension is inferred to
be [(Integer,Integer)] but needs to be RealFrac a => [(Integer,a)]
(or, more simply, [(Integer,Double)].
Prelude> let f (a,b) = a * floor (100000/b)
Prelude> :t f
f :: (RealFrac t1, Integral t) => (t, t1) -> t
Prelude> let v :: [(Integer,Double)]; v = [(a^2 + b^2,fromIntegral
a) | a <- [1..4], b <- [1..4], a^2 + b^2 < 20, b <= a]
Prelude> :t v
v :: [(Integer, Double)]
Prelude> map f v
[200000,250000,400000,333330,433329,599994,425000]
--
brandon s. allbery [solaris,freebsd,perl,pugs,haskell] [EMAIL PROTECTED]
system administrator [openafs,heimdal,too many hats] [EMAIL PROTECTED]
electrical and computer engineering, carnegie mellon university KF8NH
_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell