Monads/List monad: Difference between revisions
Content added Content deleted
Thundergnat (talk | contribs) m (→{{header|Ring}}: Remove vanity tags) |
(Added Go) |
||
Line 169: | Line 169: | ||
→ (List "1" "-8" "27" "-125") |
→ (List "1" "-8" "27" "-125") |
||
</lang> |
</lang> |
||
=={{header|Go}}== |
|||
<lang go>package main |
|||
import "fmt" |
|||
type mlist struct{ value []int } |
|||
func (m mlist) bind(f func(lst []int) mlist) mlist { |
|||
return f(m.value) |
|||
} |
|||
func unit(lst []int) mlist { |
|||
return mlist{lst} |
|||
} |
|||
func increment(lst []int) mlist { |
|||
lst2 := make([]int, len(lst)) |
|||
for i, v := range lst { |
|||
lst2[i] = v + 1 |
|||
} |
|||
return unit(lst2) |
|||
} |
|||
func double(lst []int) mlist { |
|||
lst2 := make([]int, len(lst)) |
|||
for i, v := range lst { |
|||
lst2[i] = 2 * v |
|||
} |
|||
return unit(lst2) |
|||
} |
|||
func main() { |
|||
ml1 := unit([]int{3, 4, 5}) |
|||
ml2 := ml1.bind(increment).bind(double) |
|||
fmt.Printf("%v -> %v\n", ml1.value, ml2.value) |
|||
}</lang> |
|||
{{out}} |
|||
<pre> |
|||
[3 4 5] -> [8 10 12] |
|||
</pre> |
|||
=={{header|Haskell}}== |
=={{header|Haskell}}== |