2015-02-24 4 views
2

AFAIK, Iterator.map ленив, а Vector.map нетерпелив, в основном потому, что это разные типы монад.Может быть, попробуйте быть ленивым или нетерпеливым в Scala?

Я хотел бы знать, есть ли шанс иметь EagerTry и LazyTry, которые ведут себя так же, как the current Try, но с последним (LazyTry) задерживает выполнение закрытия не прошло до результата необходимо (если это необходимо).

Обратите внимание, что объявление объявления как lazy не очень хорошо работает в Scala, в частности оно работает для заданного объема. Альтернатива существует при передаче параметров (параметры по имени). Вопрос заключается в том, как добиться ленивого поведения при возвращении (ленивых) значений во внешний охват. Option - это в основном коллекция длиной 0 или 1, это будет эквивалентный случай для ленивых коллекций (Iterator, Sequence), но ограничен длиной 0 или 1 (например, Option и Either). Меня особенно интересует Try, то есть с использованием LazyTry точно так же, как и Try. Думаю, это должно быть аналогично в других случаях (Option и Either).

Обратите внимание, что у нас уже есть EagerTry, так как текущий стандарт Try нетерпелив. К сожалению, класс запечатан, поэтому, чтобы иметь нетерпеливые и ленивые версии того же класса, нам нужно было бы определить три из них и реализовать два из них (в отличие от их определения и реализации). Точка возвращает Try без других слоев программного обеспечения, беспокоящихся о времени выполнения этого кода, то есть абстракции.

ответ

2

Да, было бы нелегко написать LazyTry. Один из возможных подходов:

sealed class LazyTry[A](block: => A) { 
    // the only place block is used 
    private lazy val underlying: Try[A] = Try(block) 
    def get = underlying.get 
    def isSuccess = underlying.isSuccess 
    ... 
} 

object LazyTry { 
    def apply[A](block: => A): LazyTry[A] = new LazyTry[A](block) 
    ... 
} 

Обратите внимание, что вы не имеют LazySuccess и LazyFailure, так как вы не знаете, какой класс использовать перед запуском block.

+0

спасибо. Это охватывает большинство методов и функций 'Try', но неспособность использовать сопоставление шаблонов - большой облом. Для такого использования я бы предпочел нечто вроде [этого] (http://pastebin.com/g7Bys3gU). В таком случае нам нужно получить фактическое значение, прежде чем что-либо делать с ним, но он инкапсулирует лень просто прекрасно, единственная проблема: использовать его непрозрачно. Я даже пошел дальше, чтобы [попытаться определить метод сопоставления] (http://pastebin.com/9CkszZGf), но это работает не очень хорошо, и у меня заканчиваются идеи. – Trylks

+0

Вы можете преобразовать его в 'Try' с' def toTry = base' и pattern match. –

+0

Или добавьте объекты 'LazySuccess' и' LazyFailure' с методами 'unapply', шаблон которых соответствует' basic'. –

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

  • Нет связанных вопросов^_^