Я хочу попробовать библиотеку Monocle. Но мне не удалось найти справочные ресурсы по базовому синтаксису.
Короче, мне нужна оптика Map[K,V] -> A
с оптикой V -> A
, как я могу это определить?
Предположим, у меня есть
import monocle.macros.GenLens
case class DirState(opened: Boolean)
object DirState {
val opened = GenLens[DirState](_.opened)
}
type Path = List[String]
type StateStore = Map[Path, DirState]
Затем я обнаруживаю место, где мне нужен простой StateStore => StateStore
, поэтому я импортирую
import monocle._
import monocle.std._
import monocle.syntax._
import monocle.function._
И пытаюсь сначала определить:
def setOpened(path: Path): StateStore => StateStore =
at(path) composeLens DirState.opened set true
Как добраться
неоднозначные неявные значения: оба метода
atMap
вtrait MapInstances
типа[K, V]=> monocle.function.At[Map[K,V],K,V]
и методatSet
вtrait SetInstances
типа[A]=> monocle.function.At[Set[A],A,Unit]
соответствуют ожидаемому типуmonocle.function.At[S,Path,A]
Пытаюсь изменить свое определение на
def setOpened(path: Path): StateStore => StateStore =
index(path) composeLens DirState.opened set true
Получение сейчас:
несоответствие типов; найдено:
monocle.function.Index[Map[Path,Nothing],Path,Nothing]
(заменяется на)monocle.function.Index[Map[List[String],Nothing],List[String],Nothing]
требуется:monocle.function.Index[Map[Path,Nothing],Path,A]
(заменяется на)monocle.function.Index[Map[List[String],Nothing],List[String],A]
Примечание:
Nothing <: A
, ноtrait Index
является неизменным в типеA
. Вместо этого вы можете определитьA
как+A
. (SLS 4.5)