Реализация "последовательности" на монаде
Работая над другим упражнением для реализации Monad.sequence() из функционального программирования в Scala , мой ответ отличается от официального / заведомо правильного ответа:
Деф последовательности[a](ЛМА: список[Ф[А]]): Ф[список[А]]
def sequence[A](lma: List[F[A]]): F[List[A]] =
lma.foldRight(unit(List[A]()))((ma, mla) => map2(ma, mla)(_ :: _))
Мое:
def sequence[A](lma: List[F[A]]): F[List[A]] = F(lma.flatten)
Пример, где F - это Option:
scala> val x: List[Option[Int]] = List( Some(1), None)
x: List[Option[Int]] = List(Some(1), None)
scala> Some(x.flatten)
res1: Some[List[Int]] = Some(List(1))
Правомерен ли здесь мой ответ (или дух его)?
Я получаю следующее исключение времени компиляции, но я конечно, если это связано с моим непониманием конструкторов типов.
Монада.scala: 15: ошибка: не найдено: значение F
Ф(лм.сплющить)
1 ответ:
Когда вы пишете
Другая часть проблемы здесь-это призыв кOption(1), на самом деле происходит то, что вы вызываете методapplyна сопутствующем объектеOption. Это только очень косвенно связано с типомOption-в частности, нет никакого способа вообще получить сопутствующий объектSomething(который является значением), если у вас есть только переменная типа, ссылающаяся на ТипSomething. На самом деле нет никакой гарантии, что сопутствующий объект вообще существует, и даже если он существует, его методapplyможет вернуть что-то, что полностью не является экземпляр типаSomething. Тот факт, чтоX.apply(...)действительно возвращаетXв случае классовListиOptionи case, полностью зависит от соглашения.List.flatten. Если вы посмотрите на "полную подпись" дляflattenв docs , Вы увидите, что она имеет неявный аргумент:Это означает, что вы можете использовать его только наdef flatten[B](implicit asTraversable: (A) => GenTraversableOnce[B]): List[B]List[A], еслиAможно неявно преобразовать вGenTraversableOnceнекоторого вида. Это не тот случай, когда генерал для любой старой монады. Я бы посоветовал вам доказать это самому себе-попробуйте свою реализацию с некоторыми другими монадами из упражнений и посмотрите, где все ломается.