在Haskell中使用Dynamic / fromDynamic时是否可以恢复约束?

巴克

我正在设计一个系统,该系统需要跟踪不同类型的表。拥有一个权威的表列表将非常方便*,而且我认为,最好的方式是作为代理列表,因为有时我确实需要该类型。我想可以选择HLists,但是即使在使用Haskell了2年之后,它们看起来仍然很笨拙,所以我的目标是Dynamic

  • 实际上,最好有0个列表,并且只需要一种在运行时查询特定类型类的所有可用实例的方法,但是我不确定是否有办法(最后一次检查)。

我的代码当前如下所示:

allCowProxies :: [Dynamic]
allCowProxies = [
    toDyn $ Proxy @HoboRecord
  , toDyn $ Proxy @AF.AfiFarmRecord
  , toDyn $ Proxy @DCP.DcPrediction
  , toDyn $ Proxy @DCF.DcFreshFeatures
  , toDyn $ Proxy @DCH.DcHistorical
  , toDyn $ Proxy @SA.ShActivity
  , toDyn $ Proxy @SRE.ShRumAndEating
  , toDyn $ Proxy @SX.SxRecord
  ]

allCowRecs :: [TypeRep]
allCowRecs = catMaybes $ toTypeRep <$> allCowProxies
  where
    toTypeRep d = case fromDynamic d of
      Just x -> Just $ typeRep x
      Nothing -> Nothing

但这会产生一个错误:

    • No instance for (Typeable proxy0)
        arising from a use of ‘fromDynamic’
    • In the expression: fromDynamic d
      In the expression:
        case fromDynamic d of
          Just x -> Just $ typeRep x
          Nothing -> Nothing
      In an equation for ‘toTypeRep’:
          toTypeRep d
            = case fromDynamic d of
                Just x -> Just $ typeRep x
                Nothing -> Nothing
   |
37 |     toTypeRep d = case fromDynamic d of
   |                        ^^^^^^^^^^^^^

数据类型都应该实现Typeable,但是如果不实现,我希望能到达Nothing这里,而不是编译时错误。从它的角度来看,我想它不能完全推断类型,而只能推断外部类型(代理)。

是否对此有任何解决方法,或者也欢迎提出替代方法。

更新资料

虽然@ Li-Yao Xia的回答确实直接回答了问题,但我最终还是寻求了一种替代解决方案,并希望在此处进行记录。它有点常规,但确实需要RankNTypes启用。

data CowRecTbl =
    Hobo   (Proxy HoboRecord)
  | Afi    (Proxy AF.AfiFarmRecord)
  | DcPred (Proxy DCP.DcPrediction)
  | DcFf   (Proxy DCF.DcFreshFeatures)
  | DcHist (Proxy DCH.DcHistorical)
  | ShAct  (Proxy SA.ShActivity)
  | ShRum  (Proxy SRE.ShRumAndEating)
  | SxTec  (Proxy SX.SxRecord)

allCowProxies :: [CowRecTbl]
allCowProxies = [
    Hobo   $ Proxy @HoboRecord
  , Afi    $ Proxy @AF.AfiFarmRecord
  , DcPred $ Proxy @DCP.DcPrediction
  , DcFf   $ Proxy @DCF.DcFreshFeatures
  , DcHist $ Proxy @DCH.DcHistorical
  , ShAct  $ Proxy @SA.ShActivity
  , ShRum  $ Proxy @SRE.ShRumAndEating
  , SxTec  $ Proxy @SX.SxRecord
  ]

cowRecTblApplyPx :: forall a.
  (forall r k. EntityRec r k => Proxy r -> a) -> CowRecTbl -> a
cowRecTblApplyPx f (Hobo px) = f px
cowRecTblApplyPx f (Afi px) = f px
cowRecTblApplyPx f (DcPred px) = f px
cowRecTblApplyPx f (DcFf px) = f px
cowRecTblApplyPx f (DcHist px) = f px
cowRecTblApplyPx f (ShAct px) = f px
cowRecTblApplyPx f (ShRum px) = f px
cowRecTblApplyPx f (SxTec px) = f px


allCowRecs :: [TypeRep]
allCowRecs = (cowRecTblApplyPx typeRep) <$> allCowProxies

随着-Werror=incomplete-patterns启用时,所有我所要做的就是记住要添加新条目allCowProxies和类型系统应该提醒我,如果我忘了别的。在某些时候,我仍然可以在评论中尝试卡尔的建议。

Li-yao Xia

要从中获取TypeRep(未编制索引)Dynamic,有dynTypeRep

dynTypeRep :: Dynamic -> TypeRep   -- TypeRep = SomeTypeRep   in the docs
allCowRecs :: [TypeRep]
allCowRecs = dynTypeRep <$> allCowProxies

我不明白为什么您同时需要allCowRecsallCowProxies,它们都编码相同的信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在类型化模板Haskell中使用约束

来自分类Dev

使用发布者确认时,是否可以恢复已被删除的邮件

来自分类Dev

在ios自动布局中使用约束时,缩短约束链是否有好处?

来自分类Dev

可以在Haskell列表推导中使用if结构吗?

来自分类Dev

我可以在haskell定义中使用“在”和“在哪里”吗?

来自分类Dev

在Haskell中使用“读取和显示”时(缺少)模糊类型

来自分类Dev

在函数中使用Haskell时,返回随机类型

来自分类Dev

在Haskell中使用Cassava解析文件时创建列表

来自分类Dev

在haskell中使用foldl时不需要参数吗?

来自分类Dev

XML模式身份约束-是否可以在选择器的XPath中使用绝对路径?

来自分类Dev

是否可以在EF7中使用流畅的API添加CHECK约束?

来自分类Dev

SQL Server-删除表是否可以恢复使用的空间

来自分类Dev

是否可以在`if语句'中使用?

来自分类Dev

Haskell解析器是否应该允许数字文字中使用Unicode数字?

来自分类Dev

在Haskell中使用范围时,为什么map返回一个附加元素?

来自分类Dev

在Haskell中使用Parsec解析字符串时,如何保留阶乘计算?

来自分类Dev

在Guards Haskell中使用案例表达式时解析错误

来自分类Dev

可以在Windows恢复环境中使用PowerShell吗?

来自分类Dev

在Propel中使用toArray()时,是否可以使用* RECURSION *删除字段?

来自分类Dev

在babel 6中使用es2015预设时,是否可以使用宽松的模块?

来自分类Dev

当github帐户使用2因素身份验证时,是否可以在Github中使用Jenkins Webhooks

来自分类Dev

恢复应用内购买是否可以与iTunes Connect上的测试帐户一起使用?

来自分类Dev

是否可以使用chart.js恢复折线图中的x轴值

来自分类Dev

是否可以从使用FileVault加密的主文件夹中恢复已删除的文件?

来自分类Dev

我已经使用gparted擦除了分区表,是否可以恢复分区?

来自分类Dev

是否可以使用偏移量X恢复fsck.ext4?

来自分类Dev

如果失败,是否可以恢复Windows 10使用Media Creation Tool以ISO下载的功能?

来自分类Dev

带TPM 2.0芯片的BitLocker-是否可以使用恢复密钥解密驱动器?

来自分类Dev

是否可以使用MySQL函数恢复字段中字母的顺序以进行排序?

Related 相关文章

  1. 1

    在类型化模板Haskell中使用约束

  2. 2

    使用发布者确认时,是否可以恢复已被删除的邮件

  3. 3

    在ios自动布局中使用约束时,缩短约束链是否有好处?

  4. 4

    可以在Haskell列表推导中使用if结构吗?

  5. 5

    我可以在haskell定义中使用“在”和“在哪里”吗?

  6. 6

    在Haskell中使用“读取和显示”时(缺少)模糊类型

  7. 7

    在函数中使用Haskell时,返回随机类型

  8. 8

    在Haskell中使用Cassava解析文件时创建列表

  9. 9

    在haskell中使用foldl时不需要参数吗?

  10. 10

    XML模式身份约束-是否可以在选择器的XPath中使用绝对路径?

  11. 11

    是否可以在EF7中使用流畅的API添加CHECK约束?

  12. 12

    SQL Server-删除表是否可以恢复使用的空间

  13. 13

    是否可以在`if语句'中使用?

  14. 14

    Haskell解析器是否应该允许数字文字中使用Unicode数字?

  15. 15

    在Haskell中使用范围时,为什么map返回一个附加元素?

  16. 16

    在Haskell中使用Parsec解析字符串时,如何保留阶乘计算?

  17. 17

    在Guards Haskell中使用案例表达式时解析错误

  18. 18

    可以在Windows恢复环境中使用PowerShell吗?

  19. 19

    在Propel中使用toArray()时,是否可以使用* RECURSION *删除字段?

  20. 20

    在babel 6中使用es2015预设时,是否可以使用宽松的模块?

  21. 21

    当github帐户使用2因素身份验证时,是否可以在Github中使用Jenkins Webhooks

  22. 22

    恢复应用内购买是否可以与iTunes Connect上的测试帐户一起使用?

  23. 23

    是否可以使用chart.js恢复折线图中的x轴值

  24. 24

    是否可以从使用FileVault加密的主文件夹中恢复已删除的文件?

  25. 25

    我已经使用gparted擦除了分区表,是否可以恢复分区?

  26. 26

    是否可以使用偏移量X恢复fsck.ext4?

  27. 27

    如果失败,是否可以恢复Windows 10使用Media Creation Tool以ISO下载的功能?

  28. 28

    带TPM 2.0芯片的BitLocker-是否可以使用恢复密钥解密驱动器?

  29. 29

    是否可以使用MySQL函数恢复字段中字母的顺序以进行排序?

热门标签

归档