Hedgehog具有一个HTraversable
类,其定义如下:
-- | Higher-order traversable functors.
--
class HTraversable t where
htraverse :: Applicative f => (forall a. g a -> f (h a)) -> t g -> f (t h)
将其与
Var
类型一起使用以对值是具体的还是抽象的类型进行参数化。 t
的类型为(* -> *) -> *
,并且是高阶函子,尽管它们实际上没有该类,f
,g
和h
的类型为* -> *
。我已经在几个不同的库中定义了相同的内容。有没有办法使光学器件摆脱困境?我承认我什至不知道该怎么办,而且我对镜头或常规的
Traversable
也不太满意。 最佳答案
当然。
type HTraversal s t a b =
forall f. Applicative f => (forall x. a x -> f (b x)) -> s -> f t
htraverse :: HTraversable t => HTraversal (t a) (t b) a b
请记住,
lens
的Traversal
是通过采用traverse
的类型并让t a
和t b
类型不同而实现的,而不是将可遍历视作多态容器,而是将其视为整体块。我不知道
HTraversal
有多有用。您不能使用(.)
很好地组合它们。关于haskell - 高阶遍历仿函数是否有相应的光学元件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47024808/