Skip to content

Instantly share code, notes, and snippets.

@wangbj
Created April 17, 2017 20:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wangbj/5939aa7a30c3d756d98f5b5775e162a6 to your computer and use it in GitHub Desktop.
Save wangbj/5939aa7a30c3d756d98f5b5775e162a6 to your computer and use it in GitHub Desktop.
type level function is quite slow
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE TypeFamilyDependencies #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ScopedTypeVariables #-}
import qualified GHC.TypeLits as TypeLits
data Z
data S n
class KnownNat n where
natSing :: n -> Integer
instance KnownNat Z where
natSing _ = 0
instance KnownNat n => KnownNat (S n) where
natSing _ = 1 + natSing (undefined :: n)
natVal :: KnownNat n => n -> Integer
natVal = natSing
type family FromInteger a where
FromInteger 0 = Z
FromInteger n = S (FromInteger (n TypeLits.- 1))
type T10k = FromInteger 10000
-- natVal (undefined :: T10k) => reduction stack overflow
main = natVal (undefined :: T10k)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment