Умножение элементов списка 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 должен быть один тип, поэтому вам нужно как-то сделать эти два типа одинаковыми.
Я также немного обеспокоен тем, что произойдет, если вы передадите пустой список этой функции.