1

私は、data type Gフィールドを持っている を持っています_repr :: Data.Graph.Inductive.Gr String StringGr通常、新しいノードをグラフに追加するとき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
4

1 に答える 1