I’m trying to implement a functional zipper:
{-# LANGUAGE UndecidableInstances #-} --needed to derive cofree Show,Eq
module DistrData.Zipper where
import Daml.Control.Recursion
import Daml.Script
data Colist x = Snoc { value : x, prev : Colist x } | Lin deriving (Show, Eq)
type ListZipper x = Cofree (ListF x) (Colist x)
deriving instance (Show x, Show a) => Show (ListF x a)
deriving instance (Show x, Show (f (Cofree f x))) => Show (Cofree f x)
main = script do
let b = [ "Hello", "world", "!"]
zipper : [x] -> ListZipper x = ($ Lin) . cata \case
Nil -> (`Cofree` Nil)
Cons x f -> \path -> Snoc x path `Cofree` Cons x (f path)
debug $ zipper b -- <-- change `debug` to `pure` fixes this
assert False
return ()
And the compiler is complaining on the script:
File: daml/DistrData/Zipper.daml Hidden: no Range: 15:1-15:5 Source: Core to DAML-LF Severity: DsError Message: Failure to process DAML program, this feature is not currently supported. Local variables defined recursively - recursion can only happen at the top level. [$dShow1, $dShow2] damlc: Error when running Shake build system: BadDependency "GenerateDalf"
It seems to be the debug
statement that triggers this, although the error is on line 15 (main
). So I suspected that the show
instances were somehow to blame. But I’ve managed to separately show
both ListF
and Cofree
, so I’m not certain anymore.
The message however seems to imply local recursion; I can’t see that in the script though.