Я играю с неким DSL, определяемым монадическим интерфейсом.
Поскольку применение монады использование множества приложений flatMap довольно обременительно, и для синтаксического понимания это не очень красиво, я пытаюсь неявно смешивать монадический и не монадический код, используя продолжения с разделителями.
Это на самом деле работает нормально, но я действительно не доволен типами, потому что я вынужден ограничивать себя типом «Любой» $ scalac -P: продолжения: включить BO.scala
и проверить в scala. REPL:
scala> import BO._
scala> test4
res0: Option[Int] = Some(14)
scala> test5
res1: Option[Int] = None
Option-Monad запускается с использованием функции runOption (см. функции тестирования). Функции, вызываемые внутри runOption , могут использовать функцию get или метод value для получения значения из опции Option . Если значение равно Нет , монада немедленно остановится и вернет Нет . Поэтому больше нет необходимости в сопоставлении с образцом для значения типа Option .
Проблема в том, что мне нужно использовать тип «Any» в runOption и для типа продолжения в get .
Можно ли выразить runOption и get с типами ранга n в scala? Поэтому я могу написать:
def runOption[C](ctx: forall A . => A @cpsParam[Option[A], Option[C]]) : Option[C] =
...
def get[A](value:Option[A]) = shift { k:(forall B . A=>Option[B]) =>
value.flatMap(k)
}
Спасибо!