Я начал изучать Скалу из интереса, и я решил, что хочу перевести пакетСкотта Улашина из 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 #?
Почему вы хотите использовать ковариацию типов? – asafc
В этом случае все, что принимает тип 'Success [Int]', также принимает экземпляр 'Failure'. Посмотрите, как они внедрили 'Option'. Экземпляр «Нет» - это просто «случайный объект». None extends Option [Nothing] '. – wheaties