[Haskell-beginners] Code works in a file but not the interpreter
Oge
kilop84 at gmail.com
Sat May 1 06:55:52 EDT 2010
2010/5/1 Daniel Fischer <daniel.is.fischer at web.de>:
> Am Samstag 01 Mai 2010 06:39:47 schrieb Oge:
>> Hi all,
>>
>> This is my first post to haskell-beginners. I am trying to use the
>> SegmentTree-0.2 library from Hackage but I get an error when I try to
>> use some of its functions. For instance when I load a file containing
>> the following
>>
>> module Stabbing.SegmentTree (counts) where
>> import Data.SegmentTree
>>
>> counts :: [(Rational, Rational)] -> [Rational] -> [Integer]
>> counts intervals points = map (countingQuery segmentTree) points
>> where
>> segmentTree = fromList intervals
>>
>> in the GHC interpreter (6.10.3), my interactions look as such
>>
>> *Stabbing.SegmentTree> counts [(4, 5)] [3]
>> [0]
>> *Stabbing.SegmentTree> fromList [(4, 5)]
>>
>> <interactive>:1:0:
>> No instance for (SegmentTree-0.2:Data.SegmentTree.Measured.Measured
>>
>> (SegmentTree-0.2:Data.SegmentTree.Interval.Interval t) t1)
>> arising from a use of `fromList' at <interactive>:1:0-16
>> Possible fix:
>> add an instance declaration for
>> (SegmentTree-0.2:Data.SegmentTree.Measured.Measured
>> (SegmentTree-0.2:Data.SegmentTree.Interval.Interval t) t1)
>> In the expression: fromList [(4, 5)]
>> In the definition of `it': it = fromList [(4, 5)]
>>
>> As you can see, "fromList intervals" is a sub-expression of counts,
>> but when I try to evaluate a similar expression at the interpreter, I
>> get an error. Does anyone know what the problem is? This is not the
>> "No instance for (Show ..." error that I'm used to.
>>
>> Ogechi Nnadi.
>
> Well,
>
> fromList :: (Monoid t, Measured (Interval a) t, Ord a)
> => [(a, a)] -> STree t a
>
> , so in fromList [(4,5)], it doesn't know what types to use for t and a,
> hence the error message that says it doesn't have an instance of Measured
> for two arbitrary types.
>
> In counts, the result of fromList, segmentTree, is used as the first
> argument of
>
> countingQuery :: (Measured (Interval a) (Sum b), Ord a)
> => STree (Sum b) a -> a -> b
>
> which resolves the 't' in fromList's type as 'Sum b' - not yet much
> progress, but the type signature
>
> counts :: [(Rational, Rational)] -> [Rational] -> [Integer]
>
> fixes the types, a is Rational and b is (Sum Integer). Now the compiler
> knows exactly what types to use, since the constraints of fromList -
> (Monoid (Sum Integer), Measured (Interval Rational) (Sum Integer), Ord
> Rational) - and countingQuery -
> (Measured (Interval Rational) (Sum Integer); Ord Rational) - are fulfilled,
> it works.
>
> If you tell ghci which types to use in
>
> fromList [(4,5)]
>
> , say
>
> fromList [(4,5)] :: STree (Sum Integer) Rational
>
> (you probably need to bring Data.Monoid into scope - import into your
> module or ":m +Data.Monoid" in ghci - to have 'Sum' available), that will
> work too.
>
It worked! Thanks a lot.
More information about the Beginners
mailing list