Решение на Poor Man's Currying от Николай Матеев

Обратно към всички решения

Към профила на Николай Матеев

Резултати

  • 10 точки от тестове
  • 1 бонус точка
  • 11 точки общо
  • 6 успешни тест(а)
  • 0 неуспешни тест(а)

Код

package main
func Repeater(s, sep string) func(int) string {
return func(count int) string {
result := ""
for i := 0; i < count; i++ {
result += s
if i != count-1 {
result += sep
}
}
return result
}
}
func Generator(gen func(int) int, initial int) func() int {
return func() int {
defer func() {
initial = gen(initial)
}()
return initial
}
}
func MapReducer(mapper func(int) int, reducer func(int, int) int, initial int) func(...int) int {
return func(values ...int) int {
initial := initial
for _, v := range values {
initial = reducer(initial, mapper(v))

В амбицията си да напиша решението максимално кратко и ясно, реших да подходя по този начин. В конкретния случай не би трябвало да е проблем initial променливата да се променя директно от closure-a.

Having said that, наясно съм, че по-идиоматично (и безопасно) е да се прави копие на променливата, за да се избяга случай, в който тя бива манипулирана от някъде другаде извън closure-а и в резултат на което потенциално да се получи неочакван резултат. :)

}
return initial
}
}

Лог от изпълнението

PASS
ok  	_/tmp/d20181024-53-illlvz	0.002s
PASS
ok  	_/tmp/d20181024-53-illlvz	0.002s
PASS
ok  	_/tmp/d20181024-53-illlvz	0.002s
PASS
ok  	_/tmp/d20181024-53-illlvz	0.002s
PASS
ok  	_/tmp/d20181024-53-illlvz	0.002s
PASS
ok  	_/tmp/d20181024-53-illlvz	0.002s

История (2 версии и 4 коментара)

Николай обнови решението на 21.10.2018 17:23 (преди 10 месеца)

+package main
+
+func Repeater(s, sep string) func(int) string {
+ return func(count int) string {
+ result := ""
+ for i := 0; i < count; i++ {
+ result += s
+ if i != count-1 {
+ result += sep
+ }
+ }
+ return result
+ }
+}
+
+func Generator(gen func(int) int, initial int) func() int {
+ return func() int {
+ defer func() {
+ initial = gen(initial)
+ }()
+ return initial
+ }
+}
+
+func MapReducer(mapper func(int) int, reducer func(int, int) int, initial int) func(...int) int {
+ return func(values ...int) int {
+ for _, v := range values {
+ initial = reducer(initial, mapper(v))

В амбицията си да напиша решението максимално кратко и ясно, реших да подходя по този начин. В конкретния случай не би трябвало да е проблем initial променливата да се променя директно от closure-a.

Having said that, наясно съм, че по-идиоматично (и безопасно) е да се прави копие на променливата, за да се избяга случай, в който тя бива манипулирана от някъде другаде извън closure-а и в резултат на което потенциално да се получи неочакван резултат. :)

+ }
+ return initial
+ }
+}

Николай обнови решението на 24.10.2018 16:31 (преди 10 месеца)

package main
func Repeater(s, sep string) func(int) string {
return func(count int) string {
result := ""
for i := 0; i < count; i++ {
result += s
if i != count-1 {
result += sep
}
}
return result
}
}
func Generator(gen func(int) int, initial int) func() int {
return func() int {
defer func() {
initial = gen(initial)
}()
return initial
}
}
func MapReducer(mapper func(int) int, reducer func(int, int) int, initial int) func(...int) int {
return func(values ...int) int {
+ initial := initial
for _, v := range values {
initial = reducer(initial, mapper(v))
}
return initial
}
}