Holes
A hole is a placeholder expression we can use when we don’t yet know what to put:
def foo [n] (x: [n]f32) : i64 = ???
The type checker will issue a warning for each hole encountered, listing the inferred type:
Warning at holes.fut:6:28-30:
Hole of type: i64
Holes can have any type, including functions:
def bar [n] (x: [n]f32) : i64 = ??? x
Which will warn us:
holes.fut:18:33-35:
Hole of type: [n]f32 -> i64
Hole expressions make it possible to sketch out the design of a program by defining only the types of top-level functions, and then gradually fill in the blanks. We can also compile and run a program with holes in it, but executing a hole results in a run-time error.
Note that because holes are subject to ordinary type inference,
they must have an unambiguous type. For example, the expression
length ???
will fail to type-check because the type checker has
no way to determine the element type or size of the placeholder
array. You can use type ascriptions to disambiguate such cases, if
necessary:
def baz n = length (??? : [n]i32)