Skip to content

Instantly share code, notes, and snippets.

@takashima0411
Created March 6, 2020 20:27
Show Gist options
  • Save takashima0411/43391bf9e1d489355561459438aed1ce to your computer and use it in GitHub Desktop.
Save takashima0411/43391bf9e1d489355561459438aed1ce to your computer and use it in GitHub Desktop.
map by foldl on go
package main
import (
"./money"
"fmt"
)
func main() {
mon := make([]money.Money, 0, 10)
mon = append(mon, money.NewSen())
mon = append(mon, money.NewGosen())
mon = append(mon, money.NewSen())
mon = append(mon, money.NewSen())
mon = append(mon, money.NewSen())
mon = append(mon, money.NewSen())
sum := foldl(mon, money.NewZero(), func(m1 money.Money, m2 money.Money) money.Money {
result := m1.Add(m2)
return result
})
mapped := Map(mon, func(m1 money.Money) money.Money {
return m1.Add(money.NewSen())
})
fmt.Println("sum: ", sum.Price())
for _, val := range mapped {
fmt.Println(val)
}
}
func foldl(ls []money.Money, z money.Money, op func(money.Money, money.Money) money.Money) money.Money {
if len(ls) == 0 {
return z
} else {
return foldl(ls[1:], op(z, ls[0]), op)
}
}
func Fold(ls []money.Money, z []money.Money, op func(money.Money, []money.Money) []money.Money) []money.Money {
if len(ls) == 0 {
return z
} else {
return Fold(ls[1:], op(ls[0], z), op)
}
}
func Map(ls []money.Money, op func(money.Money) money.Money) []money.Money {
return Fold(ls, nil, func(v money.Money, l []money.Money) []money.Money {
return append(l, op(v))
})
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment