J'essaie de créer une fonction générique capable d'accepter un fichier Maybe List
de tout enregistrement avec un id : Int
comme champ, pour savoir si un id
existe dans cette liste. Le retour peut être l'un des trois états suivants : le Found record
, NotFound
et un Loading
message (pour les cas où la liste est Nothing
).
Les erreurs m'ont conduit à ce code jusqu'à présent, mais je suis maintenant bloqué et je ne comprends pas comment résoudre ce problème à partir de l'aide à l'erreur (y compris la lecture de le lien ). Comment faire pour que cela fonctionne, et pourquoi exactement cela ne fonctionne-t-il pas ?
import Html exposing (text)
type alias RecordWithID a =
{ a | id : Int }
type alias MyRecord =
{ id : Int
, name : String
}
type Find a
= Found (RecordWithID a)
| NotFound
| Loading
findById : Int -> Maybe (List (RecordWithID a)) -> Find (RecordWithID a)
findById id maybeItems =
case maybeItems of
Just items ->
let
head = List.head <| List.filter (\x -> x.id == id) items
in
case head of
Just item ->
Found item
Nothing ->
NotFound
Nothing ->
Loading
main = text <| toString <| findById 4 (Just [ MyRecord 4 "hi" ])
Editer
L'erreur :
-- TYPE MISMATCH ---------------------------------------------------------------
The type annotation for `findById` does not match its definition.
17| findById : Int -> Maybe (List (RecordWithID a)) -> Find (RecordWithID a)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The type annotation is saying:
Int -> Maybe (List { b | id : Int }) -> Find { b | id : Int }
But I am inferring that the definition has this type:
Int -> Maybe (List { b | id : Int }) -> Find b
Hint: A type annotation is too generic. You can probably just switch to the type
I inferred. These issues can be subtle though, so read more about it.
<https://github.com/elm-lang/elm-compiler/blob/0.17.0/hints/type-annotations.md>
Je comprends que le type d'enregistrement du filtre et de l'en-tête ne correspondra pas nécessairement. a
mais ne sait pas comment résoudre le problème.