#f# #unit-type
#f# #тип единицы измерения
Вопрос:
У меня есть следующий код
if somecondition then
myobj.Property1 = match myobj.Property1 with
| null -> SomePropertyType ()
| p -> p
Что я пытаюсь сделать, так это посмотреть, есть ли myobj.Свойство1 равно нулю, если это не так, оставьте его в покое, в противном случае создайте новый объект типа SomePropertyType и назначьте его.
Проблема в том, что я получаю
This expression should have type 'unit', but has type 'bool'
И что мне делать, если мне пришлось поместить несколько из этих myobj.Свойство 1 …. операторы под этим if
?
Ответ №1:
Вы сравниваете два значения (используя =
), поэтому тип возвращаемого значения будет таким bool
, но если у вас есть if без else , компилятор ожидает unit
в качестве возвращаемого типа.
Я предполагаю, что вы намеревались присвоить значение свойству, используйте <-
вместо:
if somecondition then
myobj.Property1 <- match myobj.Property1 with ...
В любом случае, если вы хотите проверить null
, чтобы присвоить значение по умолчанию, которое вам не нужно match
, if
then
достаточно:
if somecondition then
if (myobj.Property1 = null) then myobj.Property1 <- SomePropertyType ()
...
Обновить
Вы можете «объединить» оба if
.. then
в один match
:
match (somecondition, myobj.Property1) with
| true, null -> myobj.Property1 <- SomePropertyType ()
...
Комментарии:
1. Я знаю, но мне нравится, чтобы мой код выглядел «функциональным», а if-else делает его процедурным, а не функциональным.
2. @fahadash Изменение одного if then на совпадение не сделает его более функциональным. В чистых функциональных языках if then else также является функцией. Изменение МНОГИХ if then на ОДНО совпадение — это другая история. Смотрите обновление.