, 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, , ). , . . , , , . .