Nope - because at compile time, there's no way to know whether createB's argument is a Safe or an Unsafe. That information only exists at run time. Consider the following functions.
f :: Int -> A f x = if x < 0 then Unsafe x else Safe x g :: IO B g = do x <- getLine return $ createB $ f (read x) Here, read x will convert the input (entered at runtime) to an Int (assuming it can - failure leads to a runtime exception), and then f will convert the resulting Int to an A, which is then passed to createB. But there's no way of the compiler knowing whether that A will be a Safe or an Unsafe A, since that depends on the value entered at runtime. If you want the compiler to typecheck two things differently, they need to be of different types. If you give a bit more context about what you're trying to do, someone might be able to suggest a safer way of doing what it. Cheers, Adam On 3 May 2012 11:36, Ismael Figueroa Palet <ifiguer...@gmail.com> wrote: > > Hi, I'm writing a program like this: > > data B = B Int > data A = Safe Int | Unsafe Int > > createB :: A -> B > createB (Safe i) = B i > createB (Unsafe i) = error "This is not allowed" > > Unfortunately, the situation when createB is called with an Unsafe value is > only checked at runtime. > If I omit the second case, it is not an error to not be exhaustive :-( > > Is there a way to make it a compile time error?? > > Thanks! > -- > Ismael > > > _______________________________________________ > Haskell-Cafe mailing list > Haskell-Cafe@haskell.org > http://www.haskell.org/mailman/listinfo/haskell-cafe > _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe