Хм, записи переводятся в стандартные .NET-классы, как и другие конструкции, поэтому я не вижу технической причины.
Я думаю, что решение довольно философское - Null
значения являются неинициализированными, неопределенными значениями, то, что заменяется в вычислениях с состоянием. Этого следует избегать в функциональном контексте, например, F #.
Поэтому я думаю, что типы записей как «функциональная конструкция» (не совместимые со стандартом .NET) не предназначены для переноса таких нефункциональных данных, но пользователь обязан кодировать их вручную («типы опций и т. Д.»).
Это также позволяет вам рассуждать о вашем коде и, например, проверить соответствие шаблона для всех возможных значений без потенциальной опасности иметь дело с null
значениями.
Что касается вашего кода: вам действительно нужно, чтобы он был таким императивом? Как насчет
data Tree =
| Node of int * Tree * Tree
| Nil