Работая на другое упражнение для реализации Monad.sequence()
от Functional Programming in Scala, моего ответа отличается от официального/известно, чтобы быть правильным ответ:Реализация `sequence` на Монадах
def sequence[A](lma: List[F[A]]): F[List[A]]
def sequence[A](lma: List[F[A]]): F[List[A]] =
lma.foldRight(unit(List[A]()))((ma, mla) => map2(ma, mla)(_ :: _))
Mine:
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))
Является ли мой ответ (или дух его) законным здесь?
Я получаю следующее исключение для компиляции, но я уверен, связано ли это с моим отсутствием понимания конструкторов типов.
Monad.scala:15: error: not found: value F
F(lma.flatten)
Спасибо, Тревис. Я всегда узнаю из ваших ответов. В качестве побочного вопроса, почему здесь используется 'foldRight' вместо' foldLeft'? –
Спасибо! И я не совсем уверен в 'foldRight' здесь. В некотором смысле 'foldRight' проще, чем' foldLeft', поскольку вы можете думать об этом как о замене оператора cons предоставленной функцией и пустым списком с предоставленным начальным значением. И учитывая соответствующее нестрогое определение, 'foldRight' можно использовать в бесконечных списках (или потоках), тогда как' foldLeft' не может. –
В качестве продолжения, как «foldRight», но не 'foldLeft', использоваться в бесконечном списке/потоке, если он реализован в терминах foldLeft? http://stackoverflow.com/questions/19547976/list-foldright-always-using-foldleft –