我有一个data type
G
,其中有字段_repr :: Data.Graph.Inductive.Gr String String
。通常的方式,当向Gr
图中添加新节点时,我们必须提供一个LNode a
对象,该对象基本上定义为 的元组(Int, a)
,其中 Int 是 Graph 中的节点索引 - 请参见add
下面的示例函数。
我想实现一个函数addx
,它将自动计算索引(例如通过使用Data.Graph.Inductive.newNodes
函数)。我希望addx
有 的签名,addx :: String -> G -> Int
这个函数将计算新的自由索引,修改图 G 并返回这个计算的索引。G
在 Haskell 中是否可以通过使用镜头或类似的东西来创建这样的功能(这将修改现有对象 -在这种情况下)?
我已经看到,Haskell lens 被定义为lens :: (a -> c) -> (a -> d -> b) -> Lens a b c d
和 lens 基本上是一个“getter”和“setter”,所以它的签名允许不同类型的 getter 输出(c
)、setter 值(d
)和 setter 输出(b
)。
import qualified Data.Graph.Inductive as DG
data G = G { _repr :: DG.Gr String String, _name::String} deriving ( Show )
empty :: G
empty = G DG.empty ""
add :: DG.LNode String -> G -> G
add node g = g{_repr = DG.insNode node $ _repr g}
-- is it possible to define it?
addx :: String -> G -> Int
addx name g = undefined
main :: IO ()
main = do
let g = add (1, "test2")
$ add (0, "test1")
$ empty
n1 = addx "test2" g
g2 = DG.insEdge(n1,0)
$ DG.insEdge(0,1)
print $ g