2014-12-26 4 views
1

Есть ли в Scalaz любое понятие «управляемой» монады? - тот, из которого может быть извлечено значение результата, потенциально скрытые побочные эффекты?Scalaz - runnable monad

trait RunnableM[M[_]] { 
    def runM[T](m: M[T]): T 
} 

Мне понадобится это, чтобы оценить монадическое вычисление и выйти из монады в конце. В Haskell у нас есть разные функции «run» для монадов, которые могут или не могут включать IO, поэтому тип такого типа может быть невозможен, по крайней мере, до моего мышления. Но в Скале это можно сделать.

ответ

3

Неправильное решение, но у Comonad у scalaz есть copoint, который может быть (ab) использован для достижения этого; Comonad экземпляры уже существуют для множества стандартных монадов-скаразов, и вы можете обманывать и определять их, например. Task (это может спровоцировать теоретиков, не забудьте ограничить сферу применения любого такого экземпляра там, где он вам нужен, и будем рады, что произойдет IO, не позволяйте ему заражать удаленный код). Он приглушен к экземплярам:

def runM[T](m: M[T])(implicit cm: Comonad[M]) = m.copoint 
+0

Мне просто нужно это для целей тестирования. Я не знаю много о 'Comonad' - это его основная цель? Извлечение значений из монад? –

+1

Его основной целью является составление функций формы 'M [A] => B'. Раньше (в scalaz 6) был отдельный тип «Copoint» только для извлечения значений, как вы хотите, но он был оставлен; Тони Моррис очень кричит о том, что это была плохая идея, но не объясняет, какова была настоящая проблема, поэтому я не знаю почему. (Если бы я должен был догадаться, я бы предположил, что аргумент заключается в том, что «Копенгард» является беззаконным, поэтому вы не можете писать ничего полезного, потому что вы ничего не знаете о том, что он делает с общим «М»). – lmm

Смежные вопросы