2016-08-04 1 views
3

Je veux écrire une fonction number_before_reaching_sum qui prend un int appelé somme, et renvoient un int n tel que les premiers n éléments de la liste ajouter à moins de somme, mais le Les premiers n + 1 éléments de la liste s'ajoutent à la somme ou plus. Voici mon codeErreur type ML: opérateur et opérande ne sont pas d'accord

fun number_before_reaching_sum(sum:int,lists:int list)= 
let 
val sum_list=0 
val n=0 
in 
    let fun list_compute(sum_list:int,lists2:int list,n:int)= 
      let val sum_list2=sum_list+(hd lists2) 
      in if sum_list2>=sum 
        then (sum_list2,n+1) 
       else (#1 list_compute(sum_list2,tl lists2,n+1),#2 list_compute(sum_list2,tl lists2,n+1)) 
       end 
    in #2 list_compute(sum_list,lists,n) 
    end 
end 

Le message d'erreur imprime:

hw1_1.sml:67.14-67.97 Error: operator and operand don't agree [type mismatch] 
    operator domain: {1:'Y; 'Z} 
    operand:   int * int list * int -> 'X 
    in expression: 
    (fn {1=1,...} => 1) list_compute 
hw1_1.sml:67.14-67.97 Error: operator and operand don't agree [type mismatch] 
    operator domain: {2:'Y; 'Z} 
    operand:   int * int list * int -> 'X 
    in expression: 
    (fn {2=2,...} => 2) list_compute 
hw1_1.sml:69.11-69.44 Error: operator and operand don't agree [type mismatch] 
    operator domain: {2:'Y; 'Z} 
    operand:   int * int list * int -> int * int 
    in expression: 
    (fn {2=2,...} => 2) list_compute 

Je ne peux pas comprendre pourquoi (#1 list_compute(sum_list2,tl lists2,n+1),#2 list_compute(sum_list2,tl lists2,n+1)) et #2 list_compute(sum_list,lists,n) ces 2 lignes sont fausses.

+0

En général, si vous obtenez des erreurs de ce type dans ML standard, c'est parce que vous avez oublié d'insérer une expression entre parenthèses. –

Répondre

5

f g(x,y) est analysé sous la forme (f g) (x,y), et non f (g (x,y)). Donc, vous voulez ajouter entre parenthèses comme ceci:

#1 (list_compute (sum_list2,tl lists2,n+1)) 

Sinon, il essaie d'appliquer #1 à la fonction list_compute. Le message d'erreur est le compilateur vous disant "#1 veut un tuple, mais vous lui avez donné une fonction à la place".