Domanda

Sto cercando di fare una serie di funzione, che sto utilizzando in un List.reduce HOF. Ho usato per avere un

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

, che stava lavorando grande, ma ora voglio ottenere il valore massimo di una lista, così ho pensato:

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

Questo, tuttavia, getta il seguente errore:

Minimax.fs (175,5): errore di FS0030: restrizione Valore. Il valore 'minimax' stato dedotto avere tipo generico     val Minimax: ( '_ un elenco ->' _a) [] quando '_A: Il sistema di confronto In entrambi definiscono 'Minimax' come termine di dati semplice, ne fanno una funzione con argomenti espliciti o, se non si intende per essere generica, aggiungere un tipo di annotazione.

ho aggiunto un tipo di annotazione in questo modo:

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

e compilato. Il problema ora è con la List.reduce,

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

Tipo non corrispondente. In attesa di un TreeOfPosition -> TreeOfPosition -> TreeOfPosition ma dato un elenco TreeOfPosition -> TreeOfPosition Il tipo 'TreeOfPosition' non corrisponde al tipo di 'lista TreeOfPosition'

Grazie per qualsiasi suggerimento,

Pedro Dusso

È stato utile?

Soluzione

Il problema è che min opera su due valori, ma List.min opera su un elenco di valori, quindi non si può semplicemente sostituire una funzione per l'altro. Dal momento che List.min è sostanzialmente definito come List.reduce min, probabilmente si può solo liberarsi del List.reduce e applicare direttamente minimax[minormax]. Non riesco a vedere come questo sarebbe meglio che la vostra soluzione originale con min e max, anche se ... forse si potrebbe fornire un ulteriore contesto quindi è chiaro esattamente quale problema si sta cercando di risolvere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top