I implemented a simple state machine in Python:
import time
def a():
print \"a()\"
return b
def b():
print \"b()\"
return c
def c():
print
What you want is a recursive type. Different languages have different ways of doing this.
For example, in OCaml (a statically-typed language), there is an optional compiler/interpreter flag -rectypes
that enables support for recursive types, allowing you to define stuff like this:
let rec a () = print_endline "a()"; b
and b () = print_endline "b()"; c
and c () = print_endline "c()"; a
;;
Although this is not "ugly" as you complained about in your C example, what happens underneath is still the same. The compiler simply worries about that for you instead of forcing you to write it out.
As others have pointed out, in Haskell you can use newtype
and there won't be any "overhead". But you complain about having to explicitly wrap and unwrap the recursive type, which is "ugly". (Similarly with your C example; there is no "overhead" since at the machine level a 1-member struct is identical to its member, but it is "ugly".)
Another example I want to mention is Go (another statically-typed language). In Go, the type
construct defines a new type. It is not a simple alias (like typedef
in C or type
in Haskell), but creates a full-fledged new type (like newtype
in Haskell) because such a type has an independent "method set" of methods that you can define on it. Because of this, the type definition can be recursive:
type Fn func () Fn