Apprentissage Haskell: Comment mettre en œuvre ma propre version de la fonction init

StackOverflow https://stackoverflow.com/questions/2248860

  •  20-09-2019
  •  | 
  •  

Question

Dans le cadre de l'apprentissage Haskell, je suis en train de mettre en œuvre ma propre version de différentes fonctions associées aux listes. En ce moment je suis coincé sur le init fonction. fonction init dans Haskell retourne tous les éléments d'une liste autre que le dernier élément.

Voici ce que je l'ai fait jusqu'à présent.

init' :: [Int] -> [Int]
init' [] = error "This function cannot be applied to an empty list"
init' [x] = [x]
init' (x:xs) = x : init' xs
Était-ce utile?

La solution

Votre problème est votre cas de base. Ici:

init' [x] = [x]

Vous dites que lorsque vous descendez à une liste avec un élément, vous voulez retourner cette même liste. Ce n'est pas le résultat souhaité. Lorsque vous avez une liste avec un seul élément, vous voulez retourner une liste vide (tous sauf le dernier élément d'un seul élément est une liste vide).

init' [x] = []

Sur une note de côté, vous devriez probablement déclarer comme

init' :: [a] -> [a]

Utilisation « a » comme le type qu'il généralise aux listes de quoi que ce soit, par opposition à un Ints. De cette façon, vous pouvez appeler init » une sorte de liste. "ABCDE" vous donnerait "ABCD" Par exemple INIT

Autres conseils

Votre deuxième règle devrait être:

init' [x] = []

Lorsqu'une liste ne comporte qu'un seul élément, il est le dernier, la liste sans le dernier élément est juste la liste vide.

init' [x] = [x]

Ce n'est pas correct. Si vous supprimez le dernier élément d'une liste d'un élément, vous ne recevez pas de retour la même liste, vous revenez une liste vide.

Voici ma version essayer.

init' :: [a] -> [a]

init' []  = error("This is not right, empty list is not allowed here")
init' (x:[]) = [x]
init' (x:xs:[]) = [x]
init' (x:xs) = x: init' xs
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top