While I am certainly in favour of better and more flexible approaches to 
enforcing this in the type system (I'm a big fan of all the dependent 
Haskell/singletons stuff), I don't think this is an appropriate solution here.

First off, a lot of interesting and important cases can't feasibly be solved 
right now (i.e., most things involving strings/lists). More importantly, I 
think the examples given in this thread so far are FAR beyond the capabilities 
of beginner/intermediate haskellers, whereas implementing a terminating "String 
-> Maybe a" is fairly trivial.

So in terms of pragmatical usability I think the TH approach is easier to 
implement in GHC, easier to use by end users and more flexible and powerful 
than the suggested type families/DataKinds.

I'm all in favour of some of the below directions, but pragmatically I think 
it'll be a while before any of those problems are usable by any beginners.

I also realise a lot of people prefer avoiding TH if at all possible, but given 
that this is an extension that people have to opt into that won't otherwise 
affect their code, I think that's acceptable. Personally, I'd gladly use TH in 
exchange for this sort of checking and I've talked to several others that would 
to.

Cheers,
Merijn

> On 6 Feb 2015, at 14:55, Erik Hesselink <hessel...@gmail.com> wrote:
> 
> On Fri, Feb 6, 2015 at 2:49 PM, Dominique Devriese
> <dominique.devri...@cs.kuleuven.be> wrote:
>> 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 ...
> 
> Note that there is a trick to fake this with current GHC: you can
> write an equality constraint that is false, involving the type level
> string:
> 
>>  type family MustBeTrue False error = (() ~ error)
> 
> Erik
> _______________________________________________
> ghc-devs mailing list
> ghc-d...@haskell.org
> http://www.haskell.org/mailman/listinfo/ghc-devs

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to