haskell - 用于 GADT 的 makeLenses (Haskell)

标签 haskell gadt lenses

是否有 makeLenses 的等价物?对于 GADT?如果我有一个简单的GADT喜欢:

data D a b where
  D :: (Ord a, Ord b) => !a -> !b -> D a b

有没有办法通过传入构造函数和字段名称列表来自动生成镜头?

最佳答案

我不认为它可以自动完成,但在这种特殊情况下,手动编写一些镜头并不难:

{-# LANGUAGE GADTs #-}

import Control.Lens

data D a b where
  D :: (Ord a, Ord b) => !a -> !b -> D a b

field1 :: Lens' (D a b) a
field1 f (D x y) = fmap (\x' -> D x' y) (f x)

field2 :: Lens' (D a b) b
field2 f (D x y) = fmap (\y' -> D x y') (f y)

{- If you want type-changing lenses, you can also use these signatures.
 - Note that then the target type Ord constraint has to escape.

field1 :: (Ord a2) => Lens (D a1 b) (D a2 b) a1 a2
field2 :: (Ord b2) => Lens (D a b1) (D a b2) b1 b2
 -}

似乎有一些相关的GitHub issue ,其中 Kmett 声称他们无法为存在量化的场创建镜头。

关于haskell - 用于 GADT 的 makeLenses (Haskell),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28145369/

相关文章:

haskell - `foldl`的实际使用

haskell - 输入已自动添加引号

haskell - 通过 Nat-kind 重叠实例

haskell - 镜头生成是否应该像实例一样对待

haskell - Data.Lens 或 Control.Lens

haskell - 带有 stateT 的 ForkIO

haskell - 在状态计算中使用 Lens.Family.LensLike' 作为 setter 和 getter

haskell - 如何在 Haskell 中定义异构列表的 Show

haskell - 您将如何抽象出这对 "similar shaped"数据类型中的样板文件