##
sub Y {
my ( $curried_rec ) = @_;
sub {
my ( $f1 ) = @_;
$curried_rec->( sub { $f1->( $f1 )->( @_ ) } )
}->( sub {
my ( $f2 ) = @_;
$curried_rec->( sub { $f2->( $f2 )->( @_ ) } )
} )
}
####
print Y( sub {
my ( $rec ) = @_;
sub {
my ( $n ) = @_;
$n < 2 ? 1 : $n * $rec->( $n - 1 );
}
} )->( 10 );;
3628800