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的类型为(* -> *) -> *,并且是高阶函子,尽管它们实际上没有该类,fgh的类型为* -> *。我已经在几个不同的库中定义了相同的内容。

有没有办法使光学器件摆脱困境?我承认我什至不知道该怎么办,而且我对镜头或常规的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

请记住,lensTraversal是通过采用traverse的类型并让t at b类型不同而实现的,而不是将可遍历视作多态容器,而是将其视为整体块。

我不知道HTraversal有多有用。您不能使用(.)很好地组合它们。

关于haskell - 高阶遍历仿函数是否有相应的光学元件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47024808/

10-10 18:24