Week 1 (11.04.2018): task 1#5
Conversation
src/main/scala/fpspeedrun/Eq.scala
Outdated
|
|
||
| object Eq { | ||
|
|
||
| implicit class EqOps[T](val x: T) extends AnyVal{ |
There was a problem hiding this comment.
как привести это в скоуп?
import Eq._
//или
import Eq.EqOpsоба варианта мне кажутся не очень, поэтому обычно такие вещи складываются в какой-то специальный объект вроде
import Eq.syntax._
//
import syntax.eq._
src/main/scala/fpspeedrun/Ord.scala
Outdated
| def compare(y: T)(implicit ord: Ord[T]): Compare = ord.compare(x, y) | ||
| } | ||
|
|
||
| implicit val ratioOrd: Ord[Ratio] = (x: Ratio, y: Ratio) => { |
There was a problem hiding this comment.
В данном случае, если бы это лежало в компаньоне типа, не пришлось бы реализовывать и Eq и Ord, хватило бы этого инстанса
There was a problem hiding this comment.
Это можно пояснить немного? В компаньон типа Ratio этот инстанс лучше положить?
src/main/scala/fpspeedrun/Ord.scala
Outdated
| case (a, b) if a.nonEmpty && b.isEmpty => GT | ||
| case (a :: as, b :: bs) => | ||
| val cmp = a compare b | ||
| if (cmp == EQ) as compare bs else cmp |
There was a problem hiding this comment.
нехвостовая рекурсия = StackOverflow
There was a problem hiding this comment.
А разве не хвостовая, рекурсивный вызов as compare bs же последнее действие в цепочке?Или из-за того, что операция compare ещё через имплисит обрабатывается?
src/main/scala/fpspeedrun/Ord.scala
Outdated
| object OrdInstances { | ||
| import Ord.OrdOps | ||
|
|
||
| implicit def sizeFirstListOrd[T : Ord]: Ord[List[T]] = (x: List[T], y: List[T]) => |
There was a problem hiding this comment.
не очень понял смысл этого модуля, но этот метод по крайней мере стекобезопасен, хотя и нарушает общепринятый лексикографический подход, его бы объединить с решением сверху
There was a problem hiding this comment.
Это просто искусственно придуманные варианты)) Чтобы поиграться с несколькими инстансами
No description provided.