我使用类型横向幻影类型(状态)来更改记录字段的类型(通过类型家族)。我怎样才能拿回价值呢?
假设我有以下代码:
{-# LANGUAGE TypeFamilies, DataKinds #-}
data Status = Valid | Invalid deriving(Show)
data A s = A (TF s)
type family TF (s:: Status) where
TF Valid = Int
TF Invalid = Either String Int
status :: A s -> Status
status = ???我怎么写状态?
更新
为了澄清,s是类型状态的值。因此,我希望status (A 3 :: A Valid) (例如)是Valid。
Update2
我找到了一个类型类型的解决方案(见我自己的答案),但是我更喜欢一种降低类型价值的方法。
发布于 2016-04-18 16:07:04
输入类工作,但您需要将所有的情况都滚下
class HasStatus where
status :: s -> status
instance HasStatus (A Valid) where
status = const Valid
instance HasStatus (A Invalid) where
status = const Invalid发布于 2016-04-18 17:40:13
您不能简单地编写函数status :: A s -> Status,因为(在GHC中)函数在运行时不接收任何类型参数的表示,而且在不了解s的情况下,在A s类型的参数中没有任何有用的信息。无论s是从数据类型提升到的类型,还是像*这样的传统类型,这都是适用的。
为了获取在运行时变化的信息(您的Status结果),您必须提供一些在运行时变化的输入。这可以是您发现的类型类上下文,也可以将信息添加到A本身:
data A (s :: Status) where
A1 :: Int -> A Valid
A2 :: Either String Int -> A Invalid然后可以通过参数上的模式匹配来实现status。
https://stackoverflow.com/questions/36695695
复制相似问题