2014-06-10 4 views
4

Play Framework (в 2.x) Form class имеет метод, называемый fold Кто это использование обозначается как:Play Framework Форма «складка» метод именование обоснование

anyForm.bindFromRequest().fold(
    f => redisplayForm(f), 
    t => handleValidFormSubmission(t) 
) 

По существу, первый параметр функции, что получает выполняется на связывание неудачи, а второй - успеха привязки. Для меня это похоже на «успешные» и «ошибочные» обратные вызовы функции jjery ajax.

Мой вопрос: почему разработчики игры назвали метод «сгибом»? Как отказ от ответственности я новичок в Scala, но я не вижу связи между этой и функциональной операцией Scala fold. Единственное сходство состоит в том, что это функция более высокого порядка; но я не вижу никакого объединения, которое имеет место, и он не выполняет внутреннюю реализацию в любой из функций Scala fold.

ответ

1

Я не эксперт FP, но я понимаю, что fold, вообще говоря, полностью преобразует содержимое типа в другой тип, учитывая рекурсивную структуру исходного типа, если это применимо. Обычно вы получаете результат одного типа для каждого случая исходного типа.

List наиболее известен. Я всегда думал о fold как в основном для цикла с аккумулятором, но вы также можете посмотреть на него как на два случая: один для случая Nil и один для случая Cons. Потому что фактический тип List является рекурсивным, поэтому его должно быть fold.

Стандартная библиотека Scala определяет fold на Option также с подписью fold[B](ifEmpty: ⇒ B)(f: (A) ⇒ B): B. В этом случае, поскольку тип не является рекурсивным, fold действительно просто две функции для двух случаев.

Ваш случай очень похож на Option. Тип не рекурсивный, поэтому fold в основном сводится к отображению всех случаев его состояния на один тип вывода.

Отметьте, что fold отличается от map и flatMap тем, что последние два сохраняют оригинальный тип, но меняют его содержимое.

Смежные вопросы