Умножение элементов списка Ocaml

let rec intmult =
  fun (aList ,al) ->
    if(List.tl aList == []) then
      ((List.hd aList) *  al)   
    else
      List.hd aList * al :: intmult (List.tl aList , al);; 

Почему это неправильно?

2 ответа

Решение

Это, вероятно, лучший способ написать это:

let rec intmult : int list * int -> int list =
   function ([],_) -> [0]   (* this case is not processed by your code *)
   |  ([x] ,al) -> [x * al]    (* this case returns an int in your code *)
   | (x::xs,al) ->  x * al :: intmult (xs, al);; 

Вы также можете использовать List.map:

let intmult (l,m)= List.map (fun x -> x * m) l

Две ветви вашего if возвращаются разные типы. Первая ветвь возвращает int, Второй (else) ветвь возвращает список целых. У выражения OCaml должен быть один тип, поэтому вам нужно как-то сделать эти два типа одинаковыми.

Я также немного обеспокоен тем, что произойдет, если вы передадите пустой список этой функции.

Другие вопросы по тегам