The argument for forbidding &quot;to be&quot; seems a little like the argument for forbidding &quot;is a&quot; (inheritance) relationships in programming: that any &quot;is a&quot; can be expressed more precisely as a &quot;has a&quot; and&#x2F;or &quot;does _&quot;.<p>I think it&#x27;s interesting to take the argument even further, to argue for structural types (like interfaces in Go and Typescript, and objects in OCaml) over nominal types (like Java interfaces and Haskell typeclasses). The former just says &quot;if Bar is an interface with method Blaz(int, int, bool), and Foo has a method Blaz(int, int, bool), then Foo is a Bar&quot;, while the latter require the programmer to explicitly specify that Foo is a (implements) bar.