У меня есть вопрос о стандарте «=» (равно) оператор в F #. Он позволяет сравнивать пользовательские типы соединений. Вопрос в том, в чем его сложность? Например, давайте рассмотрим следующий тип:F # равно сложность оператора
type Tree<'a> =
| Nil
| Leaf of 'a
| Node of Tree<'a> * Tree<'a>
и следующие деревья:
let a : Tree<int> = Node (Node (Node (Leaf 1, Leaf 2), Node (Leaf 3, Node (Leaf 4, Leaf 5))), Node (Leaf 6, Nil))
let b : Tree<int> = Node (Node (Node (Leaf 1, Leaf 2), Node (Leaf 3, Node (Leaf 4, Leaf 5))), Node (Leaf 6, Nil))
let c : Tree<int> = Node (Node (Node (Leaf 1, Leaf 2), Nil), Node (Node (Leaf 3, Node (Leaf 4, Leaf 5)), Leaf 6))
Очевидно, что этот код:
printfn "a = b: %b" (a = b)
printfn "a = c: %b" (a = c)
printfn "a = a: %b" (a = a)
производит этот выход:
a = b: true
a = c: false
a = a: true
Я ожидаю, что «a = b "и" a = c "компаньоны принимают линейное время. Но как насчет «a = a»? Если она постоянна, что о более сложных структур, как то один:
let d : Tree<int> = Node (a, c)
let e : Tree<int> = Node (a, c)
Будет ли она пройти через весь д и е структуры или она остановится «а =» и "с = c "?
Downvoter, порекомендовать комментарий? – svick
Я не являюсь нисходящим, но «обычная реализация« Equals », которую вы описали, не относится к объединениям F #. – Daniel
Почему бы и нет? Это ведет себя точно так. – svick