Juste pour le plaisir, voici une version roulées à la main pour la liste:
helper : List a -> a -> Int -> Int
helper lst elem offset =
case lst of
[] -> -1
x :: xs ->
if x == elem then offset
else helper xs elem (offset + 1)
indexOf lst element =
helper lst element 0
helper
recherche récursivement la liste pour l'élément, en gardant une trace du nombre d'éléments que nous avons visités jusqu'à présent. Pour la liste vide, elle renvoie -1. Si vous n'aimez pas les constantes magiques, vous pouvez facilement changer le type de retour en Maybe Int
et renvoyer Nothing
à la place.
Et voici un programme complet de l'utiliser (il suffit de copier + coller dans le REPL en ligne à elm-lang.org.
import Html exposing (text)
lst = ["Stack","Overflow","is","","awesome"]
element = ""
helper : List a -> a -> Int -> Int
helper lst elem offset =
case lst of
[] -> -1
x :: xs ->
if x == elem then offset
else helper xs elem (offset + 1)
indexOf lst element =
helper lst element 0
main =
text (toString (indexOf lst ""))
Pourquoi avez-vous besoin de l'index de l'élément? –
@FrankSchmitt Imaginez un jeu de puzzle coulissant où vous pouvez passer la position de départ via la chaîne de requête: http://moroshko.github.io/sliding-puzzle. La chaîne de requête peut ressembler à: '? Start = 3,2,1,6,5,4,, 8,7'. Le modèle dans le jeu doit connaître l'emplacement de la tuile vide. Donc, mon idée est de diviser 'start' par', ', puis de le convertir en tableau, puis de trouver la position de la chaîne vide. Pensez-vous qu'il existe une meilleure façon de représenter la position de départ dans l'URL? (les carreaux peuvent contenir plus d'un caractère, donc les virgules) –
Sons sensés. Je me demandais juste parce que dans les langages fonctionnels, les index list/array sont rarement nécessaires IME. –