List comprehensions: Difference between revisions
Content added Content deleted
(Removed {{omit from|Go}} template as this task can be completed by building something similar.) |
(Added Go) |
||
Line 804: | Line 804: | ||
# [ 13, 84, 85 ], [ 16, 63, 65 ], [ 20, 21, 29 ], [ 28, 45, 53 ], [ 33, 56, 65 ], [ 36, 77, 85 ], [ 39, 80, 89 ], |
# [ 13, 84, 85 ], [ 16, 63, 65 ], [ 20, 21, 29 ], [ 28, 45, 53 ], [ 33, 56, 65 ], [ 36, 77, 85 ], [ 39, 80, 89 ], |
||
# [ 48, 55, 73 ], [ 65, 72, 97 ] ]</lang> |
# [ 48, 55, 73 ], [ 65, 72, 97 ] ]</lang> |
||
=={{header|Go}}== |
|||
Go doesn't have special syntax for list comprehensions but we can build a function which behaves similarly. |
|||
<lang go>package main |
|||
import "fmt" |
|||
type ( |
|||
seq []int |
|||
sofs []seq |
|||
) |
|||
func newSeq(start, end int) seq { |
|||
if end < start { |
|||
end = start |
|||
} |
|||
s := make(seq, end-start+1) |
|||
for i := 0; i < len(s); i++ { |
|||
s[i] = start + i |
|||
} |
|||
return s |
|||
} |
|||
func newSofs() sofs { |
|||
return sofs{seq{}} |
|||
} |
|||
func (s sofs) listComp(in seq, expr func(sofs, seq) sofs, pred func(seq) bool) sofs { |
|||
var s2 sofs |
|||
for _, t := range expr(s, in) { |
|||
if pred(t) { |
|||
s2 = append(s2, t) |
|||
} |
|||
} |
|||
return s2 |
|||
} |
|||
func (s sofs) build(t seq) sofs { |
|||
var u sofs |
|||
for _, ss := range s { |
|||
for _, tt := range t { |
|||
uu := make(seq, len(ss)) |
|||
copy(uu, ss) |
|||
uu = append(uu, tt) |
|||
u = append(u, uu) |
|||
} |
|||
} |
|||
return u |
|||
} |
|||
func main() { |
|||
pt := newSofs() |
|||
in := newSeq(1, 20) |
|||
expr := func(s sofs, t seq) sofs { |
|||
return s.build(t).build(t).build(t) |
|||
} |
|||
pred := func(t seq) bool { |
|||
if len(t) != 3 { |
|||
return false |
|||
} |
|||
return t[0]*t[0]+t[1]*t[1] == t[2]*t[2] && t[0] < t[1] && t[1] < t[2] |
|||
} |
|||
pt = pt.listComp(in, expr, pred) |
|||
fmt.Println(pt) |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
[[3 4 5] [5 12 13] [6 8 10] [8 15 17] [9 12 15] [12 16 20]] |
|||
</pre> |
|||
=={{header|Haskell}}== |
=={{header|Haskell}}== |