2016-09-15 10 views
2

Приведено описание функции с подписи: A => F[G[B]]. Существуют экземпляры монадов для F и G типов.transform 'A => F [G [B]]' to 'F [G [A => B]' scala

Можно ли его трансформировать в подпись: F[G[A=>B]? Есть ли общее название для такого преобразования?

Иными словами, какова будет реализация prettify2?

def pretiffy(x: String): Future[Option[String]] = Future{if(x == "") None else Some(s">>>$x<<<")} 
val pretiffy2: Future[Option[String => String]] = ??? 

Обновление: Я буду благодарен за ответы, используя кошек или скаляз.

+0

Это называется * более высокие типы *. Вы можете использовать «Скалаз» или «Кошки» для работы с ними. – sebszyller

+0

Спасибо. Это действительно то, что мне нужно. Как это сделать? –

+3

Предположим, что у вас есть 'String => List [Option [Integer]]'. Вам нужно создать «List [Option [String => Integer]]». Можете ли вы это сделать? Как долго будет результирующий список? Сколько '' '' '' '' '' 'ы содержать? –

ответ

5

Предположим, у нас есть String=>List[Option[Integer]]. Нам нужно создать List[Option[String=>Integer]]. Как мы должны подходить к этому? Например, как долго должен быть результирующий список? Сколько должно быть None?

Очевидно, что эти вопросы не имеют ответов, а это означает, что запрошенная трансформация не может существовать для произвольной монады (или даже большинства монадов, поскольку можно задавать аналогичные вопросы о большинстве монадов).

+0

... вот почему рекомендуется изучить Скалаз и Кошек. Те и подобные структуры обобщают понятие монад, так что функция 'unit',' None' в случае 'Option' и' Nil' в случае 'List', может быть извлечена и использована обобщенным способом. –