Code works in a file but not the interpreter

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.

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.

2010/5/1 Daniel Fischer
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.
participants (2)
-
Daniel Fischer
-
Oge