Scalaz 7.3.7: включение синтаксиса для использования монад в for-выражениях

Вопрос или проблема

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] в области видимости.

Оцените материал
Добавить комментарий

Капча загружается...