fork(2) download
  1. {-# LANGUAGE GADTs, DataKinds, TypeFamilies, UndecidableInstances #-}
  2.  
  3. main = return ()
  4.  
  5. data Nat = Z | S Nat
  6.  
  7. data Even (a :: Nat) :: * where
  8. ZeroEven :: Even Z
  9. NextEven :: Even n -> Even (S (S n))
  10.  
  11. type family Add (n :: Nat) (m :: Nat) :: Nat
  12. type instance Add Z m = m
  13. type instance Add (S n) m = S (Add n m)
  14.  
  15. type family Mult (n :: Nat) (m :: Nat) :: Nat
  16. type instance Mult Z m = Z
  17. type instance Mult (S n) m = Add (Mult n m) n
  18.  
  19. evenPlusEven :: Even n -> Even m -> Even (Add n m)
  20. evenPlusEven ZeroEven m = m
  21. evenPlusEven (NextEven n) m = NextEven (evenPlusEven n m)
  22.  
  23. evenTimesEven :: Even n -> Even m -> Even (Mult n m)
  24. evenTimesEven ZeroEven m = ZeroEven
  25. evenTimesEven (NextEven n) m = evenPlusEven (evenTimesEven n m) (evenPlusEven m m)
Compilation error #stdin compilation error #stdout 0s 8388607KB
stdin
Standard input is empty
compilation info
[1 of 1] Compiling Main             ( prog.hs, prog.o )

prog.hs:25:32: error:
    • Could not deduce: Add (Mult n1 m) (Add m m)
                        ~
                        Add (Add (Mult n1 m) n1) ('S n1)
      from the context: n ~ 'S ('S n1)
        bound by a pattern with constructor:
                   NextEven :: forall (n :: Nat). Even n -> Even ('S ('S n)),
                 in an equation for ‘evenTimesEven’
        at prog.hs:25:16-25
      Expected type: Even (Mult n m)
        Actual type: Even (Add (Mult n1 m) (Add m m))
      NB: ‘Add’ is a type function, and may not be injective
    • In the expression:
        evenPlusEven (evenTimesEven n m) (evenPlusEven m m)
      In an equation for ‘evenTimesEven’:
          evenTimesEven (NextEven n) m
            = evenPlusEven (evenTimesEven n m) (evenPlusEven m m)
    • Relevant bindings include
        m :: Even m (bound at prog.hs:25:28)
        n :: Even n1 (bound at prog.hs:25:25)
        evenTimesEven :: Even n -> Even m -> Even (Mult n m)
          (bound at prog.hs:24:1)
stdout
Standard output is empty