类型签名的证明

时间:2016-01-19 20:20:04

标签: haskell types lens

是否可以从Haskell类型签名中获取有关其各部分关系的证据?

例如:

type role ReifiedLens representational nominal representational nominal
newtype ReifiedLens s t a b = Lens {...}
        -- Defined in ‘Control.Lens.Reified’

type Lens s t a b =
  forall (f :: * -> *). Functor f => (a -> f b) -> s -> f t

这个签名非常干燥,并没有告诉我多少。

有人可能会认为这是Lens概念意味着的精确编码。它不是。 Lens概念包括一些未在类型中显示的法律。它也可能反映Haskell的类型系统限制(知道某些限制是否会影响签名会很好。)

仅仅通过查看签名,人们可能会有直觉,许多替代s的类型将永远不会成为Lens的一部分,因为如果f t无法获得s他们是完全无关的。这就像隐藏的功能依赖。然而,您似乎能够从“稀薄的空气”中产生任何类型的价值。如果你想:

Prelude Control.Lens> (%~) _1 (const "yup") ((), Nothing)
("yup",Nothing)

如果你知道在哪里寻找,你可以找到类似上述想法的东西:

class Field1 s t a b | s -> a, t -> b, s b -> t, t a -> s

那就是"子类" Lens表示在许多典型实例中可能会看到的某些功能依赖性。但是仍然很难理解s在这种情况下的含义。需要一些努力或经验才能注意到s :: * -> *(希望没有任何扩展也会使此无效)。

如果有方法可以发现有关上述值的证据,并探索可能的关系空间,那将会很棒。或者是文档表达此类类型含义的最佳方式?

0 个答案:

没有答案