首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何提取文字幻影类型的值?

如何提取文字幻影类型的值?
EN

Stack Overflow用户
提问于 2016-04-18 13:40:21
回答 2查看 154关注 0票数 3

我使用类型横向幻影类型(状态)来更改记录字段的类型(通过类型家族)。我怎样才能拿回价值呢?

假设我有以下代码:

代码语言:javascript
复制
{-# 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

我找到了一个类型类型的解决方案(见我自己的答案),但是我更喜欢一种降低类型价值的方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-18 16:07:04

输入类工作,但您需要将所有的情况都滚下

代码语言:javascript
复制
class HasStatus where
  status :: s -> status

instance HasStatus (A Valid) where
  status = const Valid
instance HasStatus (A Invalid) where
  status = const Invalid
票数 0
EN

Stack Overflow用户

发布于 2016-04-18 17:40:13

您不能简单地编写函数status :: A s -> Status,因为(在GHC中)函数在运行时不接收任何类型参数的表示,而且在不了解s的情况下,在A s类型的参数中没有任何有用的信息。无论s是从数据类型提升到的类型,还是像*这样的传统类型,这都是适用的。

为了获取在运行时变化的信息(您的Status结果),您必须提供一些在运行时变化的输入。这可以是您发现的类型类上下文,也可以将信息添加到A本身:

代码语言:javascript
复制
data A (s :: Status) where
    A1 :: Int -> A Valid
    A2 :: Either String Int -> A Invalid

然后可以通过参数上的模式匹配来实现status

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36695695

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档