Monads/List monad: Difference between revisions
Content deleted Content added
Line 141: | Line 141: | ||
{{Out}} |
{{Out}} |
||
<syntaxhighlight 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}}</syntaxhighlight> |
<syntaxhighlight 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}}</syntaxhighlight> |
||
=={{header|ATS}}== |
|||
<syntaxhighlight lang="ats"> |
|||
#include "share/atspre_staload.hats" |
|||
(* I will use the list type of prelude/SATS/list.sats *) |
|||
#define NIL list_nil () |
|||
#define :: list_cons |
|||
fn {a : t@ype} |
|||
unit_List (x : a) : list (a, 1) = |
|||
x :: NIL |
|||
fn {a, b : t@ype} |
|||
bind_List (m : List a, |
|||
f : a -<cloref1> List b) : List0 b = |
|||
let |
|||
fun |
|||
reversed_segments (m : List a, |
|||
accum : List0 (List b)) |
|||
: List0 (List b) = |
|||
case+ m of |
|||
| NIL => accum |
|||
| hd :: tl => reversed_segments (tl, f hd :: accum) |
|||
fun |
|||
assemble_segments (segments : List (List b), |
|||
accum : List0 b) |
|||
: List0 b = |
|||
case+ segments of |
|||
| NIL => accum |
|||
| hd :: tl => |
|||
let |
|||
prval () = lemma_list_param hd |
|||
val accum = list_append (hd, accum) |
|||
in |
|||
assemble_segments (tl, accum) |
|||
end |
|||
in |
|||
assemble_segments (reversed_segments (m, NIL), NIL) |
|||
end |
|||
infixl 0 >>= |
|||
overload >>= with bind_List |
|||
fn |
|||
intseq_List {n : nat} |
|||
(i0 : int, |
|||
n : int n) :<cloref1> list (int, n) = |
|||
let |
|||
implement |
|||
list_tabulate$fopr<int> j = i0 + j |
|||
in |
|||
list_vt2t (list_tabulate<int> n) |
|||
end |
|||
implement |
|||
main0 () = |
|||
let |
|||
val n = 25 |
|||
val pythagorean_triples = |
|||
intseq_List (1, n) >>= |
|||
(lam i => |
|||
(intseq_List (succ (i : int), n) >>= |
|||
(lam j => |
|||
(intseq_List (succ (j : int), n) >>= |
|||
(lam k => |
|||
let |
|||
val i = i : int |
|||
and j = j : int |
|||
and k = k : int |
|||
in |
|||
if (i * i) + (j * j) = (k * k) then |
|||
@(i, j, k) :: NIL |
|||
else |
|||
NIL |
|||
end))))) |
|||
fun |
|||
loop {n : nat} |
|||
.<n>. |
|||
(m : list (@(int, int, int), n)) : void = |
|||
case+ m of |
|||
| NIL => () |
|||
| (@(a, b, c) :: tl) => |
|||
begin |
|||
println! ("(", a, ",", b, ",", c, ")"); |
|||
loop tl |
|||
end |
|||
in |
|||
loop pythagorean_triples |
|||
end |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
We should get a list of Pythagorean triples that start with some integer between 1 and 25, inclusive. |
|||
<pre>$ patscc -std=gnu2x -g -O2 -DATS_MEMALLOC_GCBDW list_monad_ats.dats -lgc && ./a.out |
|||
(3,4,5) |
|||
(5,12,13) |
|||
(6,8,10) |
|||
(7,24,25) |
|||
(8,15,17) |
|||
(9,12,15) |
|||
(10,24,26) |
|||
(12,16,20) |
|||
(12,35,37) |
|||
(15,20,25) |
|||
(15,36,39) |
|||
(16,30,34) |
|||
(18,24,30) |
|||
(20,21,29) |
|||
(21,28,35) |
|||
(24,32,40) |
|||
(24,45,51) |
|||
</pre> |
|||
=={{header|C}}== |
=={{header|C}}== |
||
Line 182: | Line 301: | ||
<syntaxhighlight lang="bash">$ ./monad |
<syntaxhighlight lang="bash">$ ./monad |
||
13</syntaxhighlight> |
13</syntaxhighlight> |
||
=={{header|C++}}== |
=={{header|C++}}== |