是否可以从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 :: * -> *
(希望没有任何扩展也会使此无效)。
如果有方法可以发现有关上述值的证据,并探索可能的关系空间,那将会很棒。或者是文档表达此类类型含义的最佳方式?