úÎó™      Safe-InferedJSplittable datatypes are datatypes that can be used as seeds for unfolds.  split n s splits the seed s in n seeds.  choose fs s uses part of the seed s$ to choose a function from the list fs, , and passes the remainder to that function. Convert the seed value to an int. 4If a datatype is bounded and enumerable, we can use ! to produce a value from a seed.     Safe-Infered &Data structures that can be unfolded. For example, given a data type  9 data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a) a suitable instance would be   instance Unfoldable Tree where  unfoldMap f = choose  [ spread $ pure Empty  , spread $ Leaf <$> to f H , spread $ Node <$> to (unfoldMap f) <*> to f <*> to (unfoldMap f)  ] )i.e. it follows closely the instance for  Traversable, with the addition of ,  and . #The instance can be simplified to:  instance Unfoldable Tree where  unfoldMap f = choose  [ const Empty  , Leaf . f H , spread $ Node <$> to (unfoldMap f) <*> to f <*> to (unfoldMap f)  ] 6Given a function to generate an element from a seed, , and an initial seed, generate a structure.          unfoldable-0.0.0Data.SplittableData.UnfoldableRightRLeftL SplittablesplitchoosegetInt boundedEnum Unfoldable unfoldMapunfoldleftMost rightMostspreadto$fSplittableEither$fSplittable(,)$fSplittableInteger$fSplittableStdGen$fSplittableRight$fSplittableLeft$fUnfoldable(,)$fUnfoldableEither$fUnfoldableMaybe$fUnfoldable[]