Использование продолжения Scala с разделителями для неявных монад

Я играю с неким 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)
}

Спасибо!

11
задан urso 1 September 2010 в 23:55
поделиться