私は、data type
G
フィールドを持っている を持っています_repr :: Data.Graph.Inductive.Gr String String
。Gr
通常、新しいノードをグラフに追加するときLNode a
は、基本的に のタプルとして定義されるオブジェクトを提供する必要があります(Int, a)
。ここで、Int はグラフのノード インデックスです。以下の関数の例を参照してください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 は基本的に「ゲッター」と「セッター」であるため、その署名により、さまざまなタイプのゲッター出力 ( c
)、セッター値 ( d
)、およびセッター出力 ( 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