【问题标题】:Type families can't return a RankN type -- workarounds or alternatives?类型族不能返回 RankN 类型——变通方法或替代方法?
【发布时间】:2017-10-01 21:42:21
【问题描述】:

我正在使用一个可扩展的记录库,我想编写一个函数field,它可以根据Symbol 键是否为LensTraversal 来运行在键列表中。类型族给出:

type family LensOrTraversal key keys s t a b where
    LensOrTraversal key '[] s t a b = 
        Traversal s t a b
    LensOrTraversal key (key =: val ': xs) s t a b = 
        Lens s t a b
    LensOrTraversal key (foo =: bar ': xs) s t a b = 
        LensOrTraversal key xs s t a b

这段代码给了我一个错误:

/home/matt/Projects/hash-rekt/src/Data/HashRecord/Internal.hs:433:5: 
error:
    • Illegal polymorphic type: Traversal s t a b
    • In the equations for closed type family ‘LensOrTraversal’
      In the type family declaration for ‘LensOrTraversal’

理想情况下,我希望能够为镜头和遍历重用 field 名称,因为它可以让您编写

>>> let testMap = empty & field @"foo" .~ 'a'
>>> :t testMap
HashRecord '["foo" =: Char]
>>> testMap ^. field @"foo" 
'a'
>>> testMap ^. field @"bar"
Type error
>>> testMap ^? field @"bar"
Nothing

遵循常见的lens 成语。我可以提供一个 fieldTraversal 函数来满足我的需求,但如果可能的话,我更愿意重载名称 field。您将如何解决类型族的这种限制?

【问题讨论】:

标签: haskell types haskell-lens type-families


【解决方案1】:

一个镜头已经是一个遍历,只有它的 Rank2 量词没有使用完整的约束(它只需要Functor,而不是Applicative)。

type Lens s t a b      = ∀ f . Functor f     => (a -> f b) -> s -> f t
type Traversal s t a b = ∀ f . Applicative f => (a -> f b) -> s -> f t

您应该在此约束级别引入您的类型系列:

import GHC.Exts (Constraint)
type family FieldOpticConstraint key keys :: (* -> *) -> Constraint where
  FieldOpticConstraint key '[] = Applicative
  FieldOpticConstraint key (key =: val ': xs) = Functor
  FieldOpticConstraint key (_ ': xs) = FieldOpticConstraint key xs

那么field 不应产生LensOrTraversal,而始终是具有由类型族确定的约束 的自定义Rank2 签名。

【讨论】:

  • 不错!如果我们有暗示约束,我们可以表达一些漂亮的东西,比如“必须至少是一个Traversal”。前段时间我问过这样的想法。你有没有一种巧妙的方式来表达这个概念而不需要明确的字典操作?
  • 唷,不知道。我怀疑如果我们尝试从任意多态类型中获得这样的约束,它会打开一些蠕虫。这甚至可以确定吗?
  • 不错!这解决了我的问题。现在,我只需要弄清楚如何在价值层面上对这些信息进行案例分析......
猜你喜欢
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-19
相关资源
最近更新 更多