Несоответствие типа Scala вложенному вызову функции

У меня есть этот код, который я не могу получить, чтобы работать. Предполагается, что код позволяет определить, перекрывают ли ограничительные рамки круга и прямоугольника друг друга.

    abstract class Shape
    case class Circle(r: Double, x: Double, y: Double) extends Shape
    case class Rectangle(llx: Double, lly: Double, w:Double, h:Double) extends Shape


 def boundingBox(s: Shape): Rectangle = s match {
      case Rectangle(llx, lly, w, h) => Rectangle(llx, lly, w, h)
      case Circle(r,x,y) => Rectangle(x-r, y-r, 2*r, 2*r)
    }


    def mayOverlap(s1: Shape, s2: Shape) = overlapRect(boundingBox(s1), boundingBox(s2))

    def overlapRect(r1: Rectangle, r2: Rectangle) = betweenLine(r1.llx, r1.w, r2.llx, r2.w) && betweenLine(r1.lly, r1.h, r2.lly, r2.h)

    def betweenLine(x: Double, l: Double, a: Double, k: Double): Boolean = (a <= x+l) || (a+l <= x+l)

Все функции работают правильно, за исключением mayOverlap. Когда я загружаю эти функции в интерпретатор, я получаю следующую ошибку:

<console>:63: error: type mismatch;
 found   : Rectangle(in object $iw)
 required: Rectangle(in object $iw)
       def mayOverlap(s1: Shape, s2: Shape) = overlapRect(boundingBox(s1), boundingBox(s2))
                                                                     ^
<console>:63: error: type mismatch;
 found   : Rectangle(in object $iw)
 required: Rectangle(in object $iw)
       def mayOverlap(s1: Shape, s2: Shape) = overlapRect(boundingBox(s1), boundingBox(s2))

Я очень новичок в scala, я гораздо лучше знаком с haskell, поэтому возможно, что я делаю предположения о сходстве между ними, но я пытался упростить его, и я не могу, кажется, сделать какие-либо вложенные вызовы функций в mayOverlap вообще.

1 ответ

  1. Я решил проблему, переупорядочив объявления функций так, чтобы вложенные вспомогательные функции были первыми.