-
Notifications
You must be signed in to change notification settings - Fork 29
Description
Hi there,
I'm trying to use dada
to represent a recursive type. Specifically, I have the two following types in Rust:
enum NodeType {
Leaf { kind: String, key: String },
Sequence { children: Vec<Node> },
Fallback { children: Vec<Node> },
}
struct Node {
node_type: NodeType,
name: String,
}
This allows me to represent behavior trees.
@sellout, the author of dada
, was kind enough to write a recursion Dhall type to represent this.
let Rec = https://sellout.github.io/dada/Mu/Type
let NodeType =
λ(a : Type) →
< Leaf : { kind : Text, key : Text }
| Decorator
| Sequence : { children : List a }
| Fallback : { children : List a }
>
let Node = λ(a : Type) → { type : NodeType a, name : Text }
let Tree = Rec Node
Where the Mu/Type
is defined as:
λ(f : Type → Type) → ∀(a : Type) → (f a → a) → a
Here is how I tried to build up this type in Rust:
let ty: serde_dhall::SimpleType = serde_dhall::from_str(
r#"let Rec = λ(f : Type → Type) → ∀(a : Type) → (f a → a) → a
let NodeType =
λ(a : Type) →
< Leaf : { kind : Text, key : Text }
| Decorator
| Sequence : { children : List a }
| Fallback : { children : List a }
>
let Node = λ(a : Type) → { type : NodeType a, name : Text }
let Tree = Rec Node"#,
)
.parse()
.unwrap();
which leads to the following error:
called `Result::unwrap()` on an `Err` value: Error(Dhall(Error { kind: Parse(Error { variant: ParsingError { positives: [import_alt, bool_or, natural_plus, text_append, list_append, bool_and, natural_times, bool_eq, bool_ne, combine, combine_types, equivalent, prefer, arrow, let_binding], negatives: [] }, location: Pos(444), line_col: Pos((13, 28)), path: None, line: " let Tree = Rec Node", continued_line: None }) }))
From the documentation (https://docs.rs/serde_dhall/latest/serde_dhall/enum.SimpleType.html#type-correspondence), I understand that SimpleType
does not support the T -> U
operation. Does that also apply to lambdas ? (I'm a novice in Dhall, so my apologies if I'm not using the correct terms.) Is there a way I could build this simple type "by hand" using the HashMap and provided enums method?
If this is not yet supported, do you have an idea of what changes that would be required and whether I could work on that? I'm a Dhall novice but quite competent in Rust.
Thanks