How to resolve the algorithm Monads/List monad step by step in the Go programming language
How to resolve the algorithm Monads/List monad step by step in the Go programming language
Table of Contents
Problem Statement
A Monad is a combination of a data-type with two helper functions written for that type. The data-type can be of any kind which can contain values of some other type – common examples are lists, records, sum-types, even functions or IO streams. The two special functions, mathematically known as eta and mu, but usually given more expressive names like 'pure', 'return', or 'yield' and 'bind', abstract away some boilerplate needed for pipe-lining or enchaining sequences of computations on values held in the containing data-type. The bind operator in the List monad enchains computations which return their values wrapped in lists. One application of this is the representation of indeterminacy, with returned lists representing a set of possible values. An empty list can be returned to express incomputability, or computational failure. A sequence of two list monad computations (enchained with the use of bind) can be understood as the computation of a cartesian product. The natural implementation of bind for the List monad is a composition of concat and map, which, used with a function which returns its value as a (possibly empty) list, provides for filtering in addition to transformation or mapping.
Demonstrate in your programming language the following:
Let's start with the solution:
Step by Step solution about How to resolve the algorithm Monads/List monad step by step in the Go programming language
The code defines a type mlist
that has a list of integers []int
as the underlying data structure.
The bind
method of mlist
takes a function that accepts a list of integers and returns an mlist
, and returns the mlist
resulting from applying the function to the list of integers.
The unit
function takes a list of integers as input and returns an mlist
containing the list as its underlying data structure.
The increment
function takes a list of integers and increments each element by one, returning an mlist
with the incremented list as its underlying data structure.
The double
function takes a list of integers and doubles each element, returning an mlist
with the doubled list as its underlying data structure.
In the main
function, an mlist
is created with the list of integers [3, 4, 5]
.
Then, the bind
method is called on this mlist
with the increment
function as an argument, and the result is bound to another mlist
.
Finally, the bind
method is called on the second mlist
with the double
function as an argument, and the result is printed.
The output is [3, 4, 5] -> [4, 5, 6]
Source code in the go programming language
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)
}
You may also check:How to resolve the algorithm Sum multiples of 3 and 5 step by step in the Run BASIC programming language
You may also check:How to resolve the algorithm Pseudo-random numbers/Middle-square method step by step in the Miranda programming language
You may also check:How to resolve the algorithm Polymorphism step by step in the Racket programming language
You may also check:How to resolve the algorithm Palindrome dates step by step in the Go programming language
You may also check:How to resolve the algorithm Inheritance/Multiple step by step in the Objective-C programming language