/* @flow */ type F = { foo(x: A): F } declare function foo(x: any): F; ({ foo }: F); function bar(y: F): F { return y; } function bar1(y: F): F { return y; } function bar2(y: F): F { return y; } type Functor = { map(f: (val: A) => B): Functor } function identity(val: A): Functor { return { map(f: (_: typeof val) => B): Functor { return identity(f(val)) } } }