предупреждение 10: это выражение должно иметь тип единицы - PullRequest
6 голосов
/ 30 ноября 2010

Я пишу программу в ocaml, содержащую несколько циклов «for», моя проблема в том, что для каждого из этих циклов вы получаете следующее сообщение: «Warning 10: это выражение должно иметь тип unit.»

Пример:

    let f q p rho= 

       let x = [] in  
       if q > p then
          for i=0 to rho do
              x= q :: x
          done;    
    x;;

это каждый раз, когда я использую цикл «для», как я могу решить эту проблему?

Ответы [ 2 ]

8 голосов
/ 30 ноября 2010

Есть несколько проблем с вашим кодом.

Ошибка в том, что for ничего не возвращает, и поэтому внутренняя часть цикла должна быть чисто для побочного эффекта. Так что у него должен быть тип юнита. Использование = не имеет типа блока, потому что = фактически является оператором равенства, сравнивая два значения и возвращая true или false.

Итак, вы используете неправильный оператор. Похоже, что вы пытаетесь «назначить» на x. Но в ML вы не можете присваивать «переменным», потому что они связаны со значением, когда они определены и не могут изменяться. Одним из способов получения изменчивости является использование изменяемой ячейки (называемой «ссылкой»): вы используете функцию ref для создания изменяемой ячейки из начального значения; оператор ! для получения значения; и оператор := для изменения значения внутри.

Так, например:

let f q p rho= 

   let x = ref [] in  
   if q > p then
      for i=0 to rho do
          x := q :: !x
      done;    
   !x;;
3 голосов
/ 30 ноября 2010

Этот цикл, вероятно, лучше всего выражать с помощью рекурсии:

let f q p rho= 
  let rec loop i =
    if i > rho then
      []
    else
      q::(loop (i+1))
   in
   if q > p then
      loop 0
   else
      [];;

Или мы можем сделать его хвостовым рекурсивным:

let f q p rho= 
  let rec loop i acc =
    if i > rho then
      acc
    else
      loop (i+1) (q::acc)
   in
   if q > p then
      loop 0 []
   else
      [];;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...