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

Reply via email to