Monads/Maybe monad: Difference between revisions

→‎{{header|REXX}}: added the computer programming language REXX.
(added Perl programming solution)
(→‎{{header|REXX}}: added the computer programming language REXX.)
Line 1,150:
WAT Nothing Nothing Nothing Nothing
4.285714 0.233333 2.0701966780270626 1.455287232606842 -0.727643616303421</pre>
 
=={{header|REXX}}==
This REXX version is modeled after the Zkl version.
<lang rexx>/*REXX program mimics a bind operation when trying to perform addition upon arguments. */
call add 1, 2
call add 1, 2.0
call add 1, 2.0, -6
call add self, 2
exit 0 /*stick a fork in it, we're all done. */
/*──────────────────────────────────────────────────────────────────────────────────────*/
add: void= 'VOID'; f= /*define in terms of a function&binding*/
do j=1 for arg() /*process, classify, bind each argument*/
call bind( arg(j) ); f= f arg(j)
end /*j*/
say
say 'adding' f; call sum f /*telegraph what's being performed next*/
return /*Note: REXX treats INT & FLOAT as num.*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
bind: arg a; type.a= datatype(a); return /*bind argument's kind with its "type".*/
/*──────────────────────────────────────────────────────────────────────────────────────*/
sum: parse arg a; $= 0 /*sum all arguments that were specified*/
do k=1 for words(a); ?= word(a, k)
if type.?==num & $\==void then $= ($ + word(a, k)) / 1
else $= void
end /*k*/
say 'sum=' $
return $</lang>
{{out|output|text=&nbsp; when using the default inputs:}}
<pre>
adding 1 2
sum= 3
 
adding 1 2.0
sum= 3
 
adding 1 2.0 -6
sum= -3
 
adding SELF 2
sum= VOID
</pre>
 
=={{header|Ruby}}==