Предположим, мы имели таблицу поставщиков в базе данных SQL, который мы хотим загрузить в F #:Загрузка набора рекурсивно типизированных элементов в F #
+----+--------+--------+
| ID | Name | Parent |
+----+--------+--------+
| 1 | Nest | 2 |
| 2 | Google | NULL |
| 3 | Apple | NULL |
+----+--------+--------+
Использование провайдеров типа достаточно легко получить таблицу в F #, но предположим, что мы хотим, чтобы затем преобразовать данные в последовательность Вендоры, где Vendor является тип, как это:
Vendor = {ID: int; Name: String; Parent: Vendor option}
Как бы один идти о делать это? Проблема в том, что при создании последовательности поставщиков мы не можем сопоставлять каждой строке конкретный поставщик, так как у нас пока нет последовательности поставщиков. Было бы неплохо также предположить, что приложение допускает циклы (A может иметь B в качестве родителя, а B может иметь A в качестве родителя), хотя в случае продавцов это на самом деле не имеет смысла.
Вы могли бы вместо того, чтобы определить тип поставщика, как:
Vendor = {ID: int; Name: String; ParentID: int option}
Но это, кажется, гораздо менее элегантно, так как каждый раз, когда вы хотите, чтобы ссылаться на родительскую поставщика вы должны сделать какой-то поиска. Есть ли известное решение? Это похоже на ситуацию, которая может часто возникать (особенно при работе с графами или деревьями).
Также кажется, что решение может включать в себя какую-то ленивую оценку, но мне непонятно, как здесь можно применять Lazy < 'T> типа F #.
Drats, я надеялся на более элегантное решение для существования. Благодаря! – Jonathan