Решение на Poor Man's Currying от Иван Иванов

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

Към профила на Иван Иванов

Резултати

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

Код

package main
// Should I omit the main function?
func Repeater(s, sep string) func(int) string {
return func(n int) string {
if n <= 0 {
return ""
}
result := s
for i := 0; i < n-1; i++ {
result += sep + s
}
return result
}
}
func Generator(gen func(int) int, initial int) func() int {
return func() int {
next := initial
defer func() { initial = gen(initial) }()

В случая използването на defer тук е малко странно заради наличието на променливата next. Ако разгледаш останалите решения ще видиш как там defer позволява да не се създава допълнителна променлива.

Бях го направил само с initial (затова остана и defer, в сегашния вид не е нужен), но не ми изглеждаше приятно. В крайна сметка това, което съм предал е микс от двете. Не харесвам промяна на променливи в defer - нужно е допълнително осмисляне на целия код. Например тук: func foo() (bar int) { bar = 2 defer func() { bar += 1 }() return bar } defer променя върната стойност, защото връщаме именуван резултат, и вместо 2, резултатът е 3.

return next
}
}
func MapReducer(mapper func(int) int, reducer func(int, int) int, initial int) func(...int) int {
return func(args ...int) int {
var result = initial
for _, elem := range args {
result = reducer(result, mapper(elem))
}
return result
}
}

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

PASS
ok  	_/tmp/d20181024-53-1l7q963	0.002s
PASS
ok  	_/tmp/d20181024-53-1l7q963	0.002s
PASS
ok  	_/tmp/d20181024-53-1l7q963	0.002s
PASS
ok  	_/tmp/d20181024-53-1l7q963	0.002s
PASS
ok  	_/tmp/d20181024-53-1l7q963	0.002s
PASS
ok  	_/tmp/d20181024-53-1l7q963	0.002s

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

Иван обнови решението на 18.10.2018 00:10 (преди 10 месеца)

+package main
+
+// Should I omit the main function?
+
+func Repeater(s, sep string) func(int) string {
+ return func(n int) string {
+ if n <= 0 {
+ return ""
+ }
+ result := s
+ for i := 0; i < n-1; i++ {
+ result += sep + s
+ }
+ return result
+ }
+}
+
+func Generator(gen func(int) int, initial int) func() int {
+ return func() int {
+ next := initial
+ defer func() { initial = gen(initial) }()

В случая използването на defer тук е малко странно заради наличието на променливата next. Ако разгледаш останалите решения ще видиш как там defer позволява да не се създава допълнителна променлива.

Бях го направил само с initial (затова остана и defer, в сегашния вид не е нужен), но не ми изглеждаше приятно. В крайна сметка това, което съм предал е микс от двете. Не харесвам промяна на променливи в defer - нужно е допълнително осмисляне на целия код. Например тук: func foo() (bar int) { bar = 2 defer func() { bar += 1 }() return bar } defer променя върната стойност, защото връщаме именуван резултат, и вместо 2, резултатът е 3.

+ return next
+ }
+}
+
+func MapReducer(mapper func(int) int, reducer func(int, int) int, initial int) func(...int) int {
+ return func(args ...int) int {
+ var result = initial
+ for _, elem := range args {
+ result = reducer(result, mapper(elem))
+ }
+
+ return result
+ }
+}