2017-09-10 2 views
-2

J'essaye d'écrire une fonction de filtre simple dans ML. L'idée est que la fonction only_capitals prend une liste de chaînes et renvoie une liste de chaînes, avec seulement les chaînes qui commencent par une lettre majuscule. Voici ma mise en œuvre, mais je reçois un type d'erreur que je ne comprends pas:Type Incompatibilité dans 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 

Voici l'erreur:

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

Alors, quelle est l'erreur? – melpomene

Répondre

2

La première erreur est causée par une faute de frappe; "isCapital" n'est pas le nom de la fonction que vous avez définie.

La deuxième erreur semble très étrange en raison de la première erreur - le type _ fait référence au type de isCapital.
Si vous fixez la première erreur, le second devrait ressembler davantage à

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

Ce que le compilateur essaie de dire est que vous passez la paire (isCapitalized,strs) à filter où il attend une fonction de type 'Z -> bool. Si vous look at the type of List.filter, vous remarquerez que c'est ('a -> bool) -> 'a list -> 'a list - c'est une fonction curry.

Ce que vous devez écrire est

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

Merci. Complètement oublié de currying. –