2016-09-09 4 views
3

Я начал изучать Скалу из интереса, и я решил, что хочу перевести пакетСкотта Улашина из F # в Scala, так что материал действительно окунется. Весь смысл Скотта пакет состоит в том, чтобы использовать монады практически везде, поэтому я также рассматриваю это как шанс понять монады еще больше.Перевод нестандартного типа от F # до Scala

В одном из первых слайдов, он определяет тип type Parser<'a> = Parser of (string -> Result<'a * string>), где:

type Result<'a> = 
| Success of 'a 
| Failure of string 

Тонкое вещь в этом определении является связь между 'a с обеих сторон уравнения Parser<'a>.

В любом случае, как я могу перевести приведенные выше высказывания в Scala, сохраняя тонкость, о которой я упоминал?

Для первого я думал об этом:

type ParserType[T] = String => Result[(T, String)] 

и второй (который является типом выбора), я думал об этом:

sealed trait Result[T] 
case class Success[T](result: T) extends Result[T] 
case class Failure[T](msg: String) extends Result[T] 

, но, кажется, глупо используйте [T] в Failure, так как он не использует T. Есть ли какой-то синтаксис, который может более напоминать синтаксис F #?

ответ

5

Взгляните на новый справа смещена Either в Scala 2.12 (обнажение, что существует тип Xor данных в Lib Cats.) Тем не менее, чтобы ответить на ваш вопрос прямо:

sealed trait Result[+T] 
case class Success[T](result: T) extends Result[T] 
case class Failure(msg: String) extends Result[Nothing] 

это имеет преимущество ковариации типов. Любой Failure здесь может использоваться с любыми Success. Обратите внимание, что это не обрабатывает проблемы map или flatMap.

+1

Почему вы хотите использовать ковариацию типов? – asafc

+1

В этом случае все, что принимает тип 'Success [Int]', также принимает экземпляр 'Failure'. Посмотрите, как они внедрили 'Option'. Экземпляр «Нет» - это просто «случайный объект». None extends Option [Nothing] '. – wheaties

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