<div dir="ltr">Hi Oleg,<div><br></div><div>yes, this is a bug, you are not supposed to define custom instances for the built-in operators.  I just left it open until we hook in the solver.</div><div><br></div><div>Happy holidays,</div>
<div>-Iavor</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sat, Dec 28, 2013 at 12:54 AM,  <span dir="ltr"><<a href="mailto:oleg@okmij.org" target="_blank">oleg@okmij.org</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br>
GHC 7.6.3 has quite convenient type-level numeric literals. We can use<br>
numbers like 1 and 2 in types. However, using the type level numeral<br>
has been quite a bit of a challenge, illustrated, for example, by<br>
the following SO question.<br>
<br>
<a href="http://stackoverflow.com/questions/20809998/type-level-nats-with-literals-and-an-injective-successor" target="_blank">http://stackoverflow.com/questions/20809998/type-level-nats-with-literals-and-an-injective-successor</a><br>

<br>
It seems the challenge has the reason: the type level numerals and<br>
their operations provided in GHC.TypeLits have a consistency<br>
issue. The following code demonstrates the issue: it constructs two<br>
distinct values of the type Sing 2. Singletons aren't singletons.<br>
<br>
{-# LANGUAGE KindSignatures #-}<br>
{-# LANGUAGE DataKinds #-}<br>
{-# LANGUAGE ScopedTypeVariables #-}<br>
{-# LANGUAGE TypeOperators #-}<br>
{-# LANGUAGE TypeFamilies #-}<br>
{-# LANGUAGE GADTs #-}<br>
{-# LANGUAGE PolyKinds #-}<br>
<br>
module NotSing where<br>
<br>
import GHC.TypeLits<br>
<br>
-- GHC strangely enough lets us define instances for (+)<br>
type instance 1 + 1 = 0<br>
type instance 0 + 1 = 2<br>
<br>
-- A singular representative of 1::Nat<br>
s1 :: Sing 1<br>
s1 = withSing id<br>
<br>
-- A singular representative of 2::Nat<br>
s2 :: Sing 2<br>
s2 = withSing id<br>
<br>
is2 :: IsZero 0<br>
is2 = IsSucc s1<br>
<br>
tran :: IsZero 0 -> Sing 2<br>
tran (IsSucc x) = case isZero x of<br>
                   IsSucc y -> case isZero y of<br>
                                IsZero -> x<br>
<br>
-- Another singular representative of 2::Nat<br>
-- A singular representative of 2::Nat<br>
s2' :: Sing 2<br>
s2' = tran is2<br>
<br>
<br>
{-<br>
*NotSing> s2<br>
2<br>
*NotSing> s2'<br>
1<br>
-}<br>
<br>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
<a href="mailto:Haskell-Cafe@haskell.org">Haskell-Cafe@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/haskell-cafe" target="_blank">http://www.haskell.org/mailman/listinfo/haskell-cafe</a><br>
</blockquote></div><br></div>