从 Haskell 中的 Kind 构造值
Construct value from Kind in Haskell
我想按如下方式从类型转到值,但不使用折旧的 DatatypeContexts:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DatatypeContexts #-}
import Data.Proxy
import GHC.TypeLits
data (KnownNat n) => MagicN n a = MagicN a
deriving (Show)
getMagicN :: forall n. (KnownNat n) => MagicN n Integer
getMagicN = MagicN $ natVal (Proxy :: Proxy n)
MagicN five = getMagicN :: MagicN 5 Integer
我不太担心是否使用了这种或另一种方法(Peano 数字等);要求是能够单独从类型信息构造值。
谢谢!
您只需要一种更好的方法来限制 MagicN
的第一个参数的种类。 {-# LANGUAGE KindSignatures #-}
会给你所需要的。
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE KindSignatures #-}
import Data.Proxy
import GHC.TypeLits
data MagicN (n :: Nat) a = MagicN a
deriving (Show)
其他都一样
注意:KindSignatures
由 PolyKinds
和 TypeFamilies
隐含,因此如果您使用后者中的任何一个,则无需明确添加。
我想按如下方式从类型转到值,但不使用折旧的 DatatypeContexts:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE DatatypeContexts #-}
import Data.Proxy
import GHC.TypeLits
data (KnownNat n) => MagicN n a = MagicN a
deriving (Show)
getMagicN :: forall n. (KnownNat n) => MagicN n Integer
getMagicN = MagicN $ natVal (Proxy :: Proxy n)
MagicN five = getMagicN :: MagicN 5 Integer
我不太担心是否使用了这种或另一种方法(Peano 数字等);要求是能够单独从类型信息构造值。
谢谢!
您只需要一种更好的方法来限制 MagicN
的第一个参数的种类。 {-# LANGUAGE KindSignatures #-}
会给你所需要的。
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE KindSignatures #-}
import Data.Proxy
import GHC.TypeLits
data MagicN (n :: Nat) a = MagicN a
deriving (Show)
其他都一样
注意:KindSignatures
由 PolyKinds
和 TypeFamilies
隐含,因此如果您使用后者中的任何一个,则无需明确添加。