2016-08-04 9 views
3

Ich möchte eine Funktion number_before_reaching_sum schreiben, die eine int aufgerufene Summe nimmt, und ein int n zurückgeben, so dass die ersten n Elemente der Liste zu weniger als Summe hinzufügen, aber die erste n + 1 Elemente der Liste addieren sich zur Summe oder mehr. Hier ist mein CodeStandard-ML-Fehler: Operator und Operand stimmen nicht überein

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 

Die Fehlermeldung ausgibt:

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 

ich nicht herausfinden können, warum (#1 list_compute(sum_list2,tl lists2,n+1),#2 list_compute(sum_list2,tl lists2,n+1)) und #2 list_compute(sum_list,lists,n) diese 2 Zeilen falsch sind.

+0

Im Allgemeinen, wenn Sie solche Fehler in Standard ML erhalten, liegt es daran, dass Sie vergessen haben, einen Ausdruck in Klammern zu schreiben. –

Antwort

5

f g(x,y) wird geparst als (f g) (x,y), nicht f (g (x,y)). So möchten Sie Klammern wie folgt hinzuzufügen:

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

Ansonsten versucht es #1 auf die Funktion list_compute anzuwenden. Die Fehlermeldung ist der Compiler sagt Ihnen "#1 will ein Tupel, aber Sie gaben ihm stattdessen eine Funktion".

Verwandte Themen