You are correct. You can't say: let x = if ??? then () else (5::Integer) because then the compiler can't assign a type to x. However, to achieve what you want, you might try something like this (untested code follows):
main = do l <- getLine let x = case maybeRead l of Just () -> Left () _ -> case maybeRead l of Just (i::Integer) -> Right i if isLeft x then putStrLn "Unit type detected" else putStrLn "Integer type detected"
where
maybeRead :: Read a => String -> Maybe a maybeRead x = case readsPrec x of [(a,_)] -> Just a _ -> Nothing
or something like that. Another way to do it would be to define a "universal" type:
data Univ = UUnit () | UInteger Integer | UDouble Double | ...
and define an instance of read on it that loos like the cascaded cases from above... HTH, Hal -- Hal Daume III "Computer science is no more about computers | hdaume@isi.edu than astronomy is about telescopes." -Dijkstra | www.isi.edu/~hdaume On Tue, 7 Jan 2003, Richard Uhtenwoldt wrote:
Just want to make sure I understand.
There does not exist a Haskell implementation-specific extension which provides the sort of dynamic type that would allow one to discriminate at run time between built-in types; right? eg,
main=do object<-readLn case object of --or some such syntax ()->putStrLn "void type detected" (a::Integer)->putStrLn "Integer type detected"
For those readers whose prelude is rusty, I quote from the prelude:
readLn :: Read a => IO a readLn = do l <- getLine r <- readIO l return r
And even if the object being discriminated "lacks polymorphicity", eg, this next, that does not change the answer to my question; right?
main=do command<-readLn let object=case command of "Integer"->(5::Integer) "Void"->() case object of ()->putStrLn "void type detected" (a::Integer)->putStrLn "Integer type detected" _______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell