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);;
Почему это неправильно?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);;
Почему это неправильно?Ocaml Умножение элементов списка
Это, вероятно, лучший способ написания его:
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
) ветвь возвращает список int. Выражение OCaml должно иметь один тип, поэтому вам нужно сделать эти два типа одинаковыми.
Я также немного обеспокоен тем, что произойдет, если вы передадите пустой список этой функции.
Пожалуйста, найдите время и предоставить некоторые больше мотивации/объяснение, что вы наблюдаете, и в каком отношении это не соответствует вашим ожиданиям. –
Все эти 'List.hd',' List.tl' повреждают мои глаза. Вместо этого попробуйте использовать сопоставление шаблонов в списках, у вас будет более чистый код. – gasche