C'est pourquoi j'aime Elm. À sa façon, Elm vous dit que vous avez un défaut de conception.
Regardons de plus près. Voici le code tel quel:
pickChord : Model -> Note -> Chord
pickChord model note =
let
nextChord = List.head (List.filter (testChord note) model.possibleMajorChords)
in
nextChord
Vous avez une liste d'accords majeurs que vous puis filtre pour une note spécifique. Cela produit un List
d'accords. Cependant, le type List
peut représenter une liste vide, c'est pourquoi List.head
renvoie Maybe
. Dans votre cas, List.head
peut renvoyer un Nothing
ou Just Chord
.
Maintenant, vous pouvez travail autour de cela avec les valeurs par défaut et la gestion des erreurs, mais ce sont contournements juste qui esquiver le vrai problème: Le type de liste ne correspond pas avec précision votre domaine de problème.
Si vous avez une liste de tous les les accords majeurs, je ne peux pas penser à une raison pour laquelle vous finiriez jamais avec une liste vide après application du filtre. Le filtre doit toujours trouver au moins un accord. En supposant que c'est le cas, ce dont vous avez besoin est un type semblable à List
qui peut représenter une liste jamais vide; Ce qui signifie que head
retournera toujours un Chord
et non un Maybe Chord
. Ce serait une meilleure représentation de ce que vous essayez d'accomplir.Heureusement, il existe déjà un tel type (que je n'ai pas créé mais que j'utilise beaucoup) appelé List.Nonempty
. Voici comment cela fonctionnerait:
import List.Nonempty as NE
pickChord : Model -> Note -> Chord
pickChord model note =
NE.head (NE.filter (testChord note) model.possibleMajorChords)
Votre model.possibleMajorChords
faudrait passer d'un List Chord
à un List.Nonempty Chord
, mais il fait tout le problème peut-être aller. C'est supposer bien sûr que ma revendication sur le filtre retournant toujours au moins un accord est vraie.
est ici un lien vers le paquet non vide: http://package.elm-lang.org/packages/mgold/elm-nonempty-list/latest
en fait ... filtre nécessite une valeur par défaut. Donc, vous pouvez avoir besoin d'un type différent, mais le point est List n'est probablement pas. –