why is ScopedTypeVariables not fixing this error?

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

why is ScopedTypeVariables not fixing this error?

Dennis Raddle
In the following snippet from a program in progress (designed to compute percentile rank for arbitrary lists of values) , I was hoping to declare types of functions within the main function just as a way of helping myself catch type errors. I'm getting the error "Can't match 'a' with 'a1'.... where 'a' is rigid type variable... etc. etc." on the line indicated in the comment below. The usual error I get when I try to do this without ScopedTypeVariables. So, I thought that ScopedTypeVariables was supposed to allow this kind of usage. What am I doing wrong?


{-# LANGUAGE ScopedTypeVariables #-}

import qualified Data.Map as M
import qualified Data.List as L
import Data.Map(Map)
import Data.Function

-- <percent at or below> <percent below>
data PercentileData = PercentileData Double Double

-- new attempt, October 2018: using new PercentileData construct to
-- represent percentile in both ways. (at/below, or below)
computePercentile :: Ord a => Map a Double -> Map a PercentileData
computePercentile dataIn = error "foo"
  where
    pairs :: [(a,Double)]  -- THIS IS THE LINE GETTING THE ERROR
    pairs = L.sortBy (compare `on` snd) $ M.toList dataIn


_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: why is ScopedTypeVariables not fixing this error?

Michael Snoyman
You need to put a `forall a.` in front of the `Ord a` constraint. To quote the manual on the language extension[1]

> Enable lexical scoping of type variables explicitly introduced with forall.

If it helps, the requirement of forall to be able to refer to the variable was non-obvious to me the first time I tried to use the extension.


On Tue, Oct 9, 2018 at 11:45 AM Dennis Raddle <[hidden email]> wrote:
In the following snippet from a program in progress (designed to compute percentile rank for arbitrary lists of values) , I was hoping to declare types of functions within the main function just as a way of helping myself catch type errors. I'm getting the error "Can't match 'a' with 'a1'.... where 'a' is rigid type variable... etc. etc." on the line indicated in the comment below. The usual error I get when I try to do this without ScopedTypeVariables. So, I thought that ScopedTypeVariables was supposed to allow this kind of usage. What am I doing wrong?


{-# LANGUAGE ScopedTypeVariables #-}

import qualified Data.Map as M
import qualified Data.List as L
import Data.Map(Map)
import Data.Function

-- <percent at or below> <percent below>
data PercentileData = PercentileData Double Double

-- new attempt, October 2018: using new PercentileData construct to
-- represent percentile in both ways. (at/below, or below)
computePercentile :: Ord a => Map a Double -> Map a PercentileData
computePercentile dataIn = error "foo"
  where
    pairs :: [(a,Double)]  -- THIS IS THE LINE GETTING THE ERROR
    pairs = L.sortBy (compare `on` snd) $ M.toList dataIn

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Reply | Threaded
Open this post in threaded view
|

Re: why is ScopedTypeVariables not fixing this error?

Dennis Raddle
That was easy. Thanks. I actually tried putting forall a in front of the line getting the error, but to no avail. Now fixed.

D

On Tue, Oct 9, 2018 at 1:49 AM Michael Snoyman <[hidden email]> wrote:
You need to put a `forall a.` in front of the `Ord a` constraint. To quote the manual on the language extension[1]

> Enable lexical scoping of type variables explicitly introduced with forall.

If it helps, the requirement of forall to be able to refer to the variable was non-obvious to me the first time I tried to use the extension.


On Tue, Oct 9, 2018 at 11:45 AM Dennis Raddle <[hidden email]> wrote:
In the following snippet from a program in progress (designed to compute percentile rank for arbitrary lists of values) , I was hoping to declare types of functions within the main function just as a way of helping myself catch type errors. I'm getting the error "Can't match 'a' with 'a1'.... where 'a' is rigid type variable... etc. etc." on the line indicated in the comment below. The usual error I get when I try to do this without ScopedTypeVariables. So, I thought that ScopedTypeVariables was supposed to allow this kind of usage. What am I doing wrong?


{-# LANGUAGE ScopedTypeVariables #-}

import qualified Data.Map as M
import qualified Data.List as L
import Data.Map(Map)
import Data.Function

-- <percent at or below> <percent below>
data PercentileData = PercentileData Double Double

-- new attempt, October 2018: using new PercentileData construct to
-- represent percentile in both ways. (at/below, or below)
computePercentile :: Ord a => Map a Double -> Map a PercentileData
computePercentile dataIn = error "foo"
  where
    pairs :: [(a,Double)]  -- THIS IS THE LINE GETTING THE ERROR
    pairs = L.sortBy (compare `on` snd) $ M.toList dataIn

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners

_______________________________________________
Beginners mailing list
[hidden email]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners