2016-02-15 2 views
0

У меня есть следующий кодВложенные если заявления в F #

let rec function1 element1 element2 = function 
     | [] -> [] 
     | [a;b;c;d;e;f]::t -> if true then if true then [a]::(function1 element1 element2 t) else (function1 element1 element2 t) 
     | h :: t -> (function1 element1 element2 t); 

, но это обыкновение позвольте мне проверить, если утверждение 1 и утверждение 2 верно

я получаю

  | [a;b;c;d;e;f]::t -> if true then if true then [a]::(function1 element1 element2 t) else (function1 element1 element2 t) 
    ------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

stdin(3,31): error FS0001: This expression was expected to have type 
    'a list  
but here has type 
    unit  

I пробовал много разных вещей, и это не похоже на то, что я пытаюсь что-то, что не должно работать. Помогите пожалуйста

ответ

0

Поскольку у вас есть 2 if, но только 1 ветвь else, компилятор определил тип возврата, чтобы быть единицей, так как только 1 из выражений if возвращает несоблюдение.

Вы можете исправить это либо

1: удалить вложение - это не обязательно, когда вы могли & & условия

2: добавить дополнительный еще филиал (который в вы будете случае вернутся (function1 element1 element2 т))

3

Вы заявление читается как:

if true 
    then 
    if true 
     then something 
     else somethingElse 
    // missing else 

Если stateme nt может опустить else ответвление, если тип общего выражения должен быть unit. Поэтому, когда вы опускаете else, вы можете просто добавить else() компилятором.

С другой стороны, вы определяете, что оператор match должен возвращать список.

Смежные вопросы