
Hi Cafe. I am searching for materials on one data type-related problem. Suppose we have version control system storing values of user-defined algebraic data type. 'User' (actually, programmer) wants to store his/her data and later update it by applying patches. By patch I mean value of some (another) type representing one simplest update of stored value. Say, for tree type
data Tree a = Node (Tree a) (Tree a) | Leaf a
one may write
{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE UndecidableInstances #-}
class Storable a where type Patch a :: * update :: Patch a -> a -> a
data TreeStep = Left | Right -- Like in zippers ? type family Location a :: * type instance Location (Tree a) = [TreeStep]
instance (Storable a) => Storable (Tree a) where type Patch (Tree a) = (Location (Tree a), Patch a) update = ... -- Move to specific location and call node's update
Patch here is coded explicitly but I guess there may be some generic way of it to calculate. Whether any similar work has been carried out? Will be glad to read comments! -- Thanks, Sergey