2017-09-10 2 views
-2

Ich versuche, eine einfache Filterfunktion in ML zu schreiben. Die Idee ist, dass die Funktion only_capitals eine Liste von Strings übernimmt und eine Liste von Strings zurückgibt, wobei nur die Strings mit einem Großbuchstaben beginnen. Hier ist meine Umsetzung, aber ich bin ein Typ-Fehler bekommen, die ich nicht verstehe:Typ Mismatch in ML List.filter

fun only_capitals (strs : string list) = 
    let 
    fun isCapitalized (str) = Char.isUpper(String.sub(str, 0)) 
    in 
    List.filter(isCapital, strs) 
    end 

Hier ist der Fehler:

hw3provided.sml:5.18-5.27 Error: unbound variable or constructor: isCapital 
hw3provided.sml:5.6-5.34 Error: operator and operand don't agree [tycon mismatch] 
    operator domain: 'Z -> bool 
    operand:   _ * string list 
    in expression: 
    List.filter (<errorvar>,strs) 
val it =() : unit 
+0

Also, was ist der Fehler? – melpomene

Antwort

2

Der erste Fehler wird durch einen Tippfehler verursacht werden; "isCapital" ist nicht der Name der von Ihnen definierten Funktion.

Der zweite Fehler sieht aufgrund des ersten Fehlers besonders merkwürdig aus - der Typ _ bezieht sich auf den Typ isCapital.
Wenn Sie den ersten Fehler zu beheben, sollte die zweite eher wie

Error: operator and operand don't agree [tycon mismatch] 
    operator domain: 'Z -> bool 
    operand:   (string -> bool) * string list 
    in expression: 
    List.filter (isCapitalized,strs) 

Was der Compiler versucht zu sagen ist, dass Sie das Paar (isCapitalized,strs) zu filter vorbei sind, wo es 'Z -> bool eine Funktion vom Typ erwartet. Wenn Sie look at the type of List.filter, werden Sie feststellen, dass es ('a -> bool) -> 'a list -> 'a list ist - es ist eine Curry-Funktion.

Was sollten Sie schreiben, ist

fun only_capitals (strs : string list) = 
    let 
    fun isCapitalized (str) = Char.isUpper(String.sub(str, 0)) 
    in 
    List.filter isCapitalized strs 
    end 
+0

Danke. Ganz vergessen Curry. –