module MyState where type Pos s a = s -> (a, a -> s) p2_1 :: Pos (x, y) x p2_1 = \ (x, y) -> (x, \ x1 -> (x1, y)) xP = p2_1 p2_2 :: Pos (x, y) y p2_2 = \ (x, y) -> (y, \ y1 -> (x, y1)) yP = p2_2 p3_1 :: Pos (x, y, z) x p3_1 = \ (x, y, z) -> (x, \ x1 -> (x1, y, z)) xT = p3_1 p3_2 :: Pos (x, y, z) y p3_2 = \ (x, y, z) -> (y, \ y1 -> (x, y1, z)) yT = p3_2 p3_3 :: Pos (x, y, z) z p3_3 = \ (x, y, z) -> (z, \ z1 -> (x, y, z1)) zT = p3_3 p4_1 :: Pos (x, y, z, w) x p4_1 = \ (x, y, z, w) -> (x, \ x1 -> (x1, y, z, w)) xQ = p4_1 p4_2 :: Pos (x, y, z, w) y p4_2 = \ (x, y, z, w) -> (y, \ y1 -> (x, y1, z, w)) yQ = p4_2 p4_3 :: Pos (x, y, z, w) z p4_3 = \ (x, y, z, w) -> (z, \ z1 -> (x, y, z1, w)) zQ = p4_3 p4_4 :: Pos (x, y, z, w) w p4_4 = \ (x, y, z, w) -> (w, \ w1 -> (x, y, z, w1)) wQ = p4_3 class MyState m where get :: Pos s a -> m s a set :: Pos s a -> a -> m s () -- Todo: State に Dynamic を使って、cons, nil, … を実装する -- 参考: MicroKanren.hs data MuList s a = MuNil | MuCons (Pos s a) (Pos s (MuList s a)) data MuTree s a = MuEmpty | MuBranch (Pos s (MuTree s a)) (Pos s a) (Pos s (MuTree s a)) pair x y = (x,y) triple x y z = (x,y,z)