Opened 15 years ago

Closed 15 years ago

Last modified 48 years ago

#67 closed bug (Wont Fix)

Signature context in recursive groups

Reported by: nobody Owned by: nobody
Priority: normal Milestone:
Component: Compiler (Type checker) Version: 5.0
Keywords: Cc:
Operating System: Architecture:
Type of failure: None/Unknown Test Case:
Blocked By: Blocking:
Related Tickets: Differential Rev(s):
Wiki Page:



I have a problem with signature contexts in mutually
recursive groups. I want to write a scanner, which is
able to read inputs of the form "int(3)" or
"float(2,0)" and return corresponding values of the

data Token = TInt Int
	   | TFloat Float
   deriving (Read,Show)

Both constructors have the same type. Therefore, I want
to pass them to another function, which reads the
corresponding number with the function reads:

scan :: String -> [Token]
scan ('i':'n':'t':str) = scanNumber TInt str
scan ('f':'l':'o':'a':'t':str) = scanNumber TInt str

scanNumber :: Read a => (a -> Token) -> String ->
scanNumber tokenCons ('(':str) = case reads str of
		                   ((n,(')':str1)):_) -> tokenCons
n:scan str1
		                   _            -> error "no literal"

main = print (scan "int(4)")

In Hugs this program works fine, but ghc does not
accept it, because of a mutually recursive group. Is
this a feature or a bug?
What does the Haskell 98 standard say?

Thanks and regards,

Frank Huch

Change History (1)

comment:1 Changed 15 years ago by simonmar

Status: assignedclosed
Logged In: YES 

Apparently this behaviour is mandated by Haskell 98, see:

You can avoid the problem in your case by explicitly 
passing 'reads' from scan to scanNumber, thus avoiding the 
context on scanNumber.
Note: See TracTickets for help on using tickets.