2013-04-01 12 views
-1
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 Умножение элементов списка

+1

Пожалуйста, найдите время и предоставить некоторые больше мотивации/объяснение, что вы наблюдаете, и в каком отношении это не соответствует вашим ожиданиям. –

+3

Все эти 'List.hd',' List.tl' повреждают мои глаза. Вместо этого попробуйте использовать сопоставление шаблонов в списках, у вас будет более чистый код. – gasche

ответ

1

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

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 
2

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

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

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