2010-06-22 11 views
1

J'essaye de faire un tableau de fonction, que j'utilise dans un ListFreduce HOF. Je l'habitude d'avoir unType-discordance entre List.reduce et le type défini

let minimax = [| (min : int->int->int); max |] 

qui fonctionnait très bien, mais maintenant je veux obtenir la valeur maximale d'une liste, donc je pensais:

let minimax = [|List.min; List.max|] 

Ceci, cependant, jette l'erreur suivante :

Minimax.fs (175,5): erreur FS0030: restriction de valeur. La valeur 'minimax' a été déduite pour avoir le type générique val minimax: ('_a list ->' _a) [] lorsque '_a: comparaison
Soit définir' minimax 'comme un simple terme de données, en faire une fonction avec arguments explicites ou, si vous ne souhaitez pas qu'il soit générique, ajoutez une annotation de type.

J'ai ajouté une annotation de type comme ceci:

let minimax = [|(List.min:TreeOfPosition list -> TreeOfPosition); List.max|] 

et compilé. Le problème est maintenant avec List.reduce,

| BranchP(position, children) -> List.reduce (minimax.[minOrmax]) (List.map (loop (1 - minOrmax)) children) 

Type mismatch. Attendre un TreeOfPosition -> TreeOfPosition -> TreeOfPosition mais étant donné une liste de TreeOfPosition -> TreeOfPosition Le type 'TreeOfPosition' ne correspond pas au type 'liste TreeOfPosition'

Merci pour avoir une pointe,

Pedro Dusso

Répondre

4

Le problème est que min fonctionne sur deux valeurs mais List.min fonctionne sur une liste de valeurs, donc vous ne pouvez pas simplement substituer une fonction à l'autre. Depuis List.min est fondamentalement défini comme List.reduce min, vous pouvez probablement juste se débarrasser du List.reduce et appliquer minimax[minormax] directement. Je ne vois pas comment cela serait mieux que votre solution originale avec min et max, bien que ... vous pourriez peut-être fournir un contexte supplémentaire pour que le problème que vous essayez de résoudre soit plus clair.

+0

Oui, j'ai raté une certaine contextualisation, mais votre conseil (Puisque List.min est essentiellement défini comme List.reduce min) a bien fonctionné! Je vous remercie! –