#!/usr/local/bin/perl #!/usr/bin/perl use strict; use warnings; package Monad::IO; sub new { my $class = shift; bless shift, $class; } sub bind { my ( $m0, $fm1 ) = @_; $fm1->( $m0->() ); } sub push { my ( $m0, $m1 ) = @_; shift->bind( __PACKAGE__->new( sub { $m1 } ) ); } use overload '>>=' => sub { shift->bind(@_) }, '>>' => sub { shift->push(@_) }, fallback => 1, ; # export の代わり sub main::monad(&) { Monad::IO->new(shift) } package main; my $getClockTime = monad { localtime() . '' }; my $putStrLn = sub { my $str = shift; monad { print "$str\n" }; }; sub pi { atan2( 1, 1 ) * 4 } # >>= も >> も perl では右結合なので括弧 my $main = ( $getClockTime >>= $putStrLn ) >> $putStrLn->( pi() ); $main->();