Proposal: ValidateMonoLiterals - Initial bikeshed discussion
Dominique Devriese
dominique.devriese at cs.kuleuven.be
Fri Feb 6 13:49:29 UTC 2015
2015-02-06 14:20 GMT+01:00 Adam Gundry <adam at well-typed.com>:
> It seems to me that what you would describe would work, and the
> avoidance of TH is a merit, but the downside is the complexity of
> implementing even relatively simple validation at the type level (as
> opposed to just reusing a term-level function). For Merijn's Even
> example I guess one could do something like this in current GHC:
>
> type family IsEven (n :: Nat) :: Bool where
> IsEven 0 = True
> IsEven 1 = False
> IsEven n = n - 2
>
> instance (KnownNat n, IsEven n ~ True)
> => HasIntegerLiteral Even n where
> literal = Even (natVal (Proxy :: Proxy n))
>
> but anything interesting to do with strings (e.g. checking that
> ByteStrings are ASCII) is rather out of reach at present.
Agreed. For the idea to scale, good support for type-level
programming with Integers/Strings/... is essential. Something else
that would be useful is an unsatisfiable primitive constraint
constructor `UnsatisfiableConstraint :: String -> Constraint` that can
be used to generate custom error messages. Then one could write
something like
type family MustBeTrue (t :: Bool) (error :: String) :: Constraint
type family MustBeTrue True _ = ()
type family MustBeTrue False error = UnsatisfiableConstraint error
type family MustBeEven (n :: Nat) :: Constraint
type family MustBeEven n = MustBeTrue (IsEven n) ("Error in Even
literal :'" ++ show n ++ "' is not even!")
instance (KnownNat n, MustBeEven n) => HasIntegerLiteral Even n where ...
Regards,
Dominique
More information about the ghc-devs
mailing list