[Haskell] Re: overloading of list operations
Andrew U. Frank
frank at geoinfo.tuwien.ac.at
Thu Sep 6 06:28:46 EDT 2007
sorry for the empty post before - what i wanted to says is, but the
send button was to quickly reached:
---------------------
i think this is a perfect example that the statement made earlier,
namely that list overloading confuses beginners, but
overloading numbers does not, is wrong.
i would therefore recommend
(1) that all operators in Haskell' are made into classes to allow their
overloading - in accordance with the polymorphic character of haskell
(today).
and
(2) that the number system with the default conversions is critically
evaluated. in my programming, the overloading of numbers and the
defaults come in may way more often than not (i'd rather not have it
automatically done! like many other things in haskell which are not
automatic).
overloading of numbers - as currently done - makes it difficult to use
GHCi as a convenient and easy to use desktop calculator - more flexible
and powerful than most others and in competition with mathematica and
mathcad etc.
(there is a large user pool!)
andrew
On 6 Sep 07 12 22, Andrew U. Frank wrote:
> On 5 Sep 07 23 28, Brandon S. Allbery KF8NH wrote:
> >
> > 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]
> > allbery at kf8nh.com
> > system administrator [openafs,heimdal,too many hats]
> > allbery at ece.cmu.edu
> > electrical and computer engineering, carnegie mellon university
> > KF8NH
> >
> >
> > _______________________________________________
> > Haskell mailing list
> > Haskell at haskell.org
> > http://www.haskell.org/mailman/listinfo/haskell
> >
> >
>
>
>
> _______________________________________________
> Haskell mailing list
> Haskell at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell
>
More information about the Haskell
mailing list