scala: mettre en œuvre un générique récursif de la fonction max
J'essaie de port ce haskell max implémentation de la fonction à la scala
maximum' :: (Ord a) => [a] -> a
maximum' [] = error "maximum of empty list"
maximum' [x] = x
maximum' (x:xs) = max x (maximum' xs)
Ceci est ma première tentative:
def max[T <: Ordered[T]](list: List[T]): T = list match {
case Nil => throw new Error("maximum of empty list")
case head :: Nil => head
case list => {
val maxTail = max(list.tail)
if (list.head > maxTail) list.head else maxTail
}
}
max(List[Int](3,4))
Mais j'obtiens l'erreur suivante:
inferred type arguments [Int] do not conform to method max's type parameter bounds [T <: Ordered[T]]
J'ai essayé avec la commande, comprable, etc avec des résultats similaires...
La moindre idée de ce qu'il manque?
Vous devez vous connecter pour publier un commentaire.
Peut-être que vous voulez le
Ordering
type de classe?C'est, après tout, comment l'intégré dans
max
méthode fonctionne:Vous pouvez nettoyer les choses beaucoup si vous faites cela:
Ou, vous pouvez en faire la queue-récursive pour une meilleure efficacité (parce que le compilateur de l'optimiser):
Aussi, vous devriez jeter
RuntimeException
ou une sous-classe, pasError
.ord.max
est différente deList.max
. L'un est à la base un opérateur qui compare deux choses, tandis que l'autre est une méthode d'un ensemble de la collection. Ils ont juste arriver à avoir le même nom.Est allé par le biais d'un exercice similaire que l'OP sans filtrage et de types génériques, et est venu avec les éléments suivants:
J'ai juste de venir avec cette solution.
max(List(-3, -7, -2)
). Cela peut être résolu en modifiant la secondeif
àif( xs.tail.isEmpty || xs.head >= max(xs.tail) )
.Je suis venu avec une solution simple qui est facile à comprendre. Il accueille une liste vide, une liste avec un seul élément, et les nombres négatifs.
Oups, aurais dû regarder mieux avant de demander
J'ai trouvé la réponse dans ce fil: https://stackoverflow.com/a/691674/47633
Il semble que Haskell des classes de type sont mis en œuvre à l'aide implicites dans scala (comme dans la dhg de l'exemple)
de sorte qu'il se termine comme ça:
ou avec un sucre syntaxique, juste
Encore, je pense que le compilateur a suffisamment d'informations pour le faire par lui-même...
ps: je prettied un peu la fonction...
ou, si nécessaire, seulement la fonction max avec la queue de la récursivité et le type de l'Option[_] ne pas casser la transparence référentielle
c'est la façon la plus simple qui me vient en tête:
List
de seulement 7 éléments, avec le max élément à la fin, répète 126 fois. Changement à 8 éléments et il parcourt 254 fois, soit environ le double pour chaque (plus petit) élément ajouté (avant la fin).cela fonctionne
Mon résoudre: