从 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)

其他都一样

注意:KindSignaturesPolyKindsTypeFamilies 隐含,因此如果您使用后者中的任何一个,则无需明确添加。