gpt4 book ai didi

haskell - 如何获取类型参数?

转载 作者:行者123 更新时间:2023-12-02 14:41:01 25 4
gpt4 key购买 nike

这是代表现实世界物理单位的数据类型:

import qualified Prelude as P
import Prelude hiding ((+), (*), (/), (-), Int, pi)

data Int = Zero | Succ Int | Pred Int

data Unit :: Int -> Int -> Int -> * where
U :: Double -> Unit m s kg

(+) :: Unit m s kg -> Unit m s kg -> Unit m s kg
(-) :: Unit m s kg -> Unit m s kg -> Unit m s kg
(*) :: Unit m1 s1 kg1 -> Unit m2 s2 kg2 -> Unit (Plus m1 m2) (Plus s1 s2) (Plus kg1 kg2)
(/) :: Unit m1 s1 kg1 -> Unit m2 s2 kg2 -> Unit (Minus m1 m2) (Minus s1 s2) (Minus kg1 kg2)

和 Show 实例:

instance Show (Unit m s kg) where
show (U a) = show a

这样,我只能显示值而不能显示类型(是时间还是速度还是长度类型)。我想知道如何获取类型参数m、s、kg然后显示出来?

完整代码为here .

最佳答案

您将需要更多扩展:

{-# LANGUAGE PolyKinds, ScopedTypeVariables #-}

PolyKinds 开启了更邪恶的类型黑客攻击,而 ScopedTypeVariables 允许您在函数定义中引用绑定(bind)在实例头和类型签名中的类型变量。

然后我们可以编写以下内容:

data Proxy a = Proxy

class IntRep (n :: Int) where
natToInt :: Proxy (n :: Int) -> Integer
instance IntRep Zero where
natToInt _ = 0
instance (IntRep n) => IntRep (Succ n) where
natToInt _ = 1 P.+ (natToInt (Proxy :: Proxy n))
instance (IntRep n) => IntRep (Pred n) where
natToInt _ = (natToInt (Proxy :: Proxy n)) P.- 1

ProxyPolyKinds 结合使用,可以引用 IntRep 实例声明中定义的 n。幻像类型计算的常用策略是仅使用 undefined::t,但 undefined 具有 * 类型,因此 undefined::零是一种不匹配。因为您将 Unit 定义为 Unit::Int -> Int -> Int -> * 而不是 Unit::* -> * -> * -> * 这种额外的误导是必需的。

最后是Show实例:

instance (IntRep m, IntRep s, IntRep kg) => Show (Unit m s kg) where
show (U a) = unwords [show a, "m^" ++ u0, "s^" ++ u1, "kg^" ++ u2]
where u0 = show $ natToInt (Proxy :: Proxy m)
u1 = show $ natToInt (Proxy :: Proxy s)
u2 = show $ natToInt (Proxy :: Proxy kg)

Prelude> main
0.1 m^1 s^-1 kg^0

补充阅读:http://comments.gmane.org/gmane.comp.lang.haskell.glasgow.user/22159

关于haskell - 如何获取类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19341824/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com