F#, вычисление дистанции между узлами дерева
От: zverjuga Беларусь  
Дата: 22.07.19 21:29
Оценка: -1
приветствую. засел за изучение F#. язык и подход для меня новый, все переворачивается с ног на голову, потому прошу помощи. имеется следующий код

module Street

    type Paint =
        | FillColor of float
        | BorderColor of float
        | BorderWidth of float

    type Point =
        | Position of x:float * y:float
        | Description of string
        | Radius of float
        | Lanes of uint32

    type Street =
        | Node of Street * Point list * Street // back * points * right. street like tree
        | Empty

    let distance (pt1: Point) (pt2: Point) =
        let square x = x * x
        sqrt <| square (pt1.x - pt2.x) + square (pt1.y - pt2.y)


смысл следующий. тип Stree — это дорога, представленная в виде дерева. в самом простом случае это дерево имеет вид простого списка, без ответвлений, вот его и рассматриваю.
тип Street хранит в себе узлы (предыдущий, следующий) список типов Point, которые описывают конкретный узел. Point можно рассматривать как некий атрибут, который может принимать следующие типы

Position — координата
Descriptiom — текстовое описание
Radius — радиус
Lanes — количество полос

каждый нод Street может хранить в себе произвольное количество Point

ну суть здесь не в этом. а в том, что получаю ошибку компиляции функции distance

Error FS0039 The field, constructor or member 'x/y' is not defined.


смысл ошибки понятен, но не совсем понятно, как сказать компилятору, что тип Point на самом деле является Position. пробовал разные способы

pt1: Point(x, y)
pt1: Point(x:float, y: float)
pt1: Position
pt1: Position(x, y)

и так далее

может кто подсказать, как заставить компилятор понять, какой тип я передаю в distance?

благодарю
проклятый антисутенерский закон
Отредактировано 22.07.2019 21:30 zverjuga . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.