Monads/List monad: Difference between revisions

Content added Content deleted
(Add Ocaml)
Line 141: Line 141:
{{Out}}
{{Out}}
<lang AppleScript>{{3, 4, 5}, {5, 12, 13}, {6, 8, 10}, {7, 24, 25}, {8, 15, 17}, {9, 12, 15}, {12, 16, 20}, {15, 20, 25}}</lang>
<lang AppleScript>{{3, 4, 5}, {5, 12, 13}, {6, 8, 10}, {7, 24, 25}, {8, 15, 17}, {9, 12, 15}, {12, 16, 20}, {15, 20, 25}}</lang>

=={{header|C}}==

The C type which best fits the concept used here for <code>monad</code> would be <code>void*</code>.

There's some limitations -- the list type characteristics in this context, if they had been used, would have required special attention to issues like traversing the list. And, C does not provide syntactic sugar which a user would likely expect from experience in some other languages.

Still, the task example is constrained enough that we can provide an implementation like:

<lang C>#include <stdio.h>
#include <stdlib.h>

#define MONAD void*
#define INTBIND(f, g, x) (f((int*)g(x)))
#define RETURN(type,x) &((type)*)(x)

MONAD boundInt(int *x) {
return (MONAD)(x);
}

MONAD boundInt2str(int *x) {
char buf[100];
char*str= malloc(1+sprintf(buf, "%d", *x));
sprintf(str, "%d", *x);
return (MONAD)(str);
}

void task(int y) {
char *z= INTBIND(boundInt2str, boundInt, &y);
printf("%s\n", z);
free(z);
}

int main() {
task(13);
}</lang>

Which, from the command line, might look like:

<lang bash>$ ./monad
13</lang>



=={{header|C++}}==
=={{header|C++}}==
Line 272: Line 314:
340, 357, 493
340, 357, 493
</pre>
</pre>



=={{header|Clojure}}==
=={{header|Clojure}}==