, sameNat n (sing :: Sing 0)
n ~ 0
, n ( Just Refl
), n , Nothing
. n
, , Nothing
, sameNat
( , sPred
, 1 <= n
).
, -, , n ~ 0
, , 1 <= n
. - :
data IsZero (n :: Nat)
where Zero :: (0 ~ n) => IsZero n
NonZero :: (1 <= n) => IsZero n
deriving instance Show (IsZero n)
replicate''
:
isZero :: forall n. SNat n -> IsZero n
isZero n = _
replicate'' :: SNat n -> a -> Vect n a
replicate'' n x = case isZero n
of Zero -> Nil
NonZero -> x ::> replicate'' (sPred n) x
, isZero
, , , Nat
.
, isZero
. , sameNat
, . Data.Singletons.Decide
, , . :
isZero :: forall n. SNat n -> IsZero n
isZero n = case n %~ (SNat @0)
of Proved Refl -> Zero
Disproved nonsense -> NonZero
, ! Proved
( , sameNat
Just Refl
, ). " " nonsense
, (n :~: 0) -> Void
, ( ), "", n :~: 0
, , n
0
. , 1 <= n
; , n
0, 1, , GHC .
- singleton Ord
SNat @1 :%<= n
:
isZero :: forall n. SNat n -> IsZero n
isZero n = case (SNat @1) %:<= n
of STrue -> NonZero
SFalse -> Zero
, STrue
SFalse
- True
False
, . , 0 ~ n
1 <= n
( , SNat @0
). .
. , ; , <
<=
, , Nat
.
, :
isZero :: forall n. SNat n -> IsZero n
isZero n = case n %~ (SNat @0)
of Proved Refl -> Zero
Disproved _ -> unsafeCoerce (NonZero @1)
NonZero
, n
1 , - n
, , 1 - 1 .
:
{-
, GADTs
, KindSignatures
, ScopedTypeVariables
, StandaloneDeriving
, TypeApplications
, TypeOperators
import GHC.TypeLits ( type (<=), type (-) )
import Data.Singletons.TypeLits ( Sing (SNat), SNat, Nat )
import Data.Singletons.Prelude.Enum ( sPred )
import Data.Singletons.Decide ( SDecide ((%~))
, Decision (Proved, Disproved)
, (:~:) (Refl)
)
import Unsafe.Coerce ( unsafeCoerce )
data IsZero (n :: Nat)
where Zero :: (0 ~ n) => IsZero n
NonZero :: (1 <= n) => IsZero n
deriving instance Show (IsZero n)
isZero :: forall n. SNat n -> IsZero n
isZero n = case n %~ (SNat @0)
of Proved Refl -> Zero
Disproved _ -> unsafeCoerce (NonZero @1)
data Vect (n :: Nat) a
where Nil :: Vect 0 a
(::>) :: a -> Vect (n - 1) a -> Vect n a
deriving instance Show a => Show (Vect n a)
replicate'' :: SNat n -> a -> Vect n a
replicate'' n x = case isZero n
of Zero -> Nil
NonZero -> x ::> replicate'' (sPred n) x
head'' :: (1 <= n) => Vect n a -> a
head'' (x ::> _) = x
main :: IO ()
main = putStrLn
. (:[])
. head''
$ replicate''
(SNat @1000000000000000000000000000000000000000000000000000000)
'\x1f60e'
, KA Buhr, unsafeCoerce
, , , Vect n a
SNat n
, ( iterate
Int
), , SNat n
Vect n a
. , ( ), , Refuted _ :: Decision (n :~: 0)
1 <= n
, isZero
( , , a SNat
).
, Vect
, , "" , GHC Nat
, . Data.Constraint.Nat
constraints
, (, drop :: (k <= n) => SNat k -> Vect n a -> Vect (n - k) a
, , , leTrans
, , , 1 <= k
1 <= n
, , ). , . . , , , . .