我想从一个类型到值如下,但不使用折旧的 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 数等),我不太担心;要求是能够仅从类型信息中构造值。
谢谢!