On 10/09/2021 4:14 AM Branimir Maksimovic <branimir.maksimovic@gmail.com> wrote:
{-# LANGUAGE KindSignatures,FlexibleInstances #-}
import Data.IntSet (IntSet)
import qualified Data.IntSet as IntSet
import Data.Set (Set)
import qualified Data.Set as Set
import Maybes
-- Start with this definition:
data Var s x
= Var {
xs :: s x
, getX :: s x -> Maybe x
}
x :: Var Set Double
x = Var (Set.fromList [1,2,3]) Set.lookupMax
data Person m
= Person {
name :: m String
, age :: m Int
}
person0 :: Person (Var Set)
person0 = Person {
name = Var (Set.fromList ["alice", "bob"]) Set.lookupMin
, age = Var (Set.fromList [20,30]) Set.lookupMin
}
varMay :: Person (Var Set) -> Person Maybe
varMay (Person nm ag) =
Person (getX nm (xs nm)) (getX ag (xs ag))
instance Show (Var' IntSet Int)
where
show (Var' a b) = show a
data Var' a b = Var'{
xs' :: a
,getX' :: a -> Maybe b
}
y :: Var' IntSet Int
y = Var' (IntSet.fromList [1,2,3]) (fmap fst . IntSet.minView)
Thanks for this suggestion, but here Var' is defined as a totally separate type than Var, whereas I want/need Var to be defined in terms of Var'.