F # Это выражение должно иметь тип ‘unit’, но имеет тип ‘bool’

#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 на ОДНО совпадение — это другая история. Смотрите обновление.