Вопрос или проблема
Scalaz 7.3.7: включение синтаксиса для использования монад в for-выражениях
В Scalaz 7.3.7 у меня есть неявный Monad[M]
в области видимости.
Какие импорты необходимы для использования этого монады в for
выразениях, если Monad[M]
уже в области видимости?
Например:
def foo(a: Int): M[Boolean] = ???
def bar(b: Boolean): M[String] = ???
for {
b <- foo(1)
s <- bar(b)
} yield s
Я пробовал оба варианта
import scalaz._
import Scalaz._
и
import scalaz.syntax.monad._
но в обоих случаях компилятор жалуется, что не может найти map
или flatMap
.
Какой правильный импорт для Scalaz 7.3.7? Я предпочел бы вариант à la carte, если это возможно.
Ответ или решение
Для использования синтаксиса для работы с монадами в for
-компонованиях в Scalaz 7.3.7, если у вас уже есть неявный контекст Monad[M]
, вам нужно импортировать необходимые элементы из пакета Scalaz.
Основное импортируемое в данном случае — это методы для расширения типа монады, чтобы они были доступны для for
-выражений. Вам необходимо импортировать методы map
и flatMap
для вашего монады. В Scalaz это можно сделать следующим образом:
import scalaz._
import scalaz.syntax.monad._
Однако, если вы хотите использовать более избирательный (a la carte) подход, вы можете импортировать конкретные методы map
и flatMap
из модуля scalaz.std
. Например, если вы работаете с Option
, List
или другим стандартным типом коллекции, вы можете сделать следующие импорты:
import scalaz.std.option._ // для Option
import scalaz.std.list._ // для List
// и так далее для других стандартных типов...
Таким образом, для полного примера кода с учетом ваших функций foo
и bar
, вы должны убедиться, что все используемые типы имеют соответствующие импорты.
Ваша функция может выглядеть следующим образом:
import scalaz._
import scalaz.syntax.monad._
import scalaz.std.option._ // Замените option на ваш конкретный тип M, если это не Option
def foo(a: Int): M[Boolean] = ???
def bar(b: Boolean): M[String] = ???
for {
b <- foo(1)
s <- bar(b)
} yield s
После этого компилятор должен правильно распознавать методы map
и flatMap
, и ваш код должен компилироваться без ошибок. Если вы по-прежнему сталкиваетесь с проблемами, убедитесь, что ваш тип M
действительно имеет имплицитное значение Monad[M]
в области видимости.