How to type-check and normalize incomplete code
Benefit from the language even when prototyping
You can type-check and normalize incomplete code by introducing a function argument named
TODO
that has the following type:
λ(TODO : ∀(a : Type) → a) → …
Then you can use TODO
to fill any gaps in your code that have not been
implemented yet:
λ(TODO : ∀(a : Type) → a)
→ let List/map = https://prelude.dhall-lang.org/List/map
let Text/concatSep = https://prelude.dhall-lang.org/Text/concatSep
let Person = { name : Text, age : Natural }
-- ↓ You can leave functions unimplemented
let renderPerson = TODO (Person → Text)
let renderList =
λ(elements : List Text) → "[" ++ Text/concatSep ", " elements ++ "]"
let renderPeople
: List Person → Text
= λ(people : List Person) →
renderList (List/map Person Text renderPerson people)
in renderPeople
[ { name = "John", age = 23 }
, TODO Person -- ← You can also leave values unimplemented
, { name = "Mary", age = 24 }
]
The type ∀(a : Type) → a
is an impossible type that can never be created in Dhall,
so the TODO
function argument can never be satisfied. However, despite that we can
still type-check the function and normalize the function body:
$ dhall --annotate <<< './example.dhall'
( λ(TODO : ∀(a : Type) → a) →
"["
++ ( TODO
({ age : Natural, name : Text } → Text)
{ age = 23, name = "John" }
++ ", "
++ TODO
({ age : Natural, name : Text } → Text)
(TODO { age : Natural, name : Text })
++ ", "
++ TODO
({ age : Natural, name : Text } → Text)
{ age = 24, name = "Mary" }
)
++ "]"
)
: ∀(TODO : ∀(a : Type) → a) → Text