2017-07-16 1 views
1
type Msg 
    = NoOp 
    | RequestDate 
    | ReceiveDate Date 
    | UpdateYouTubeUrl YouTubeUrl 

-- - 

root : Maybe YouTubeUrl -> Html Msg 
root youTubeUrl = 
    case youTubeUrl of 
     Just youTubeUrl -> 
      div [] 
       [ player youTubeUrl 
       , urlInput 
       ] 

     Nothing -> 
      urlInput 


player : YouTubeUrl -> Html Msg 
player youTubeUrl = 
    h1 [] [ text ("YouTube player for " ++ youTubeUrl ++ " goes here") ] 


urlInput : Html (YouTubeUrl -> Msg) 
urlInput = 
    input 
     [ placeholder "(Enter a YouTube embed URL and hit <Enter>)" 
     , onSubmit UpdateYouTubeUrl 
     ] 
     [] 

Cela me donne une erreur d'incompatibilité de type:mismatch Elm Voir la liste

-- TYPE MISMATCH ---------------------------------- ./src/YouTubePlayer/View.elm 

The 1st and 2nd entries in this list are different types of values. 

28|     [ player youTubeUrl 
29|>    , urlInput 
30|     ] 

The 1st entry has this type: 

    Html (Msg) 

But the 2nd is: 

    Html (YouTubeUrl -> Msg) 

Hint: It looks like a function needs 1 more argument. 

Hint: Every entry in a list needs to be the same type of value. This way you 
never run into unexpected values partway through. To mix different types in a 
single list, create a "union type" as described in: 
<http://guide.elm-lang.org/types/union_types.html> 

Detected errors in 1 module. 

L'erreur est assez clair que le problème est que j'ai une liste de

[ Html Msg 
, Html (YouTubeUrl -> Msg) 
] 

.. où les listes dans Elm doivent être homogènes, mais ce que je ne comprends pas est pourquoi Html (YouTubeUrl -> Msg) est la signature de type pour urlInput. Je suppose que cela a quelque chose à voir avec mon utilisation de onSubmit. Je suis un débutant d'orme ici, donc je ne suis pas sûr de ce que je fais mal. Le Elm Guide book n'a aucun type d'exemple qui ressemble à Html (a -> Msg) que j'ai vu.


elm 0.18

Répondre

2

Le problème provient de votre utilisation de onSubmit, dont la signature est celle-ci:

onSubmit : msg -> Attribute msg 

Vous passez un constructeur, UpdateYouTubeUrl, qui prend un seul paramètre. Afin de faire un Msg en utilisant UpdateYouTubeUrl, vous devez passer un paramètre de type YouTubeUrl. Ce paramètre n'est pas passé, donc le compilateur d'Elm vous dit que la fonction urlElement a besoin d'un paramètre YouTubeUrl. Mon sentiment est que vous vouliez utiliser onInput, qui accepte une valeur de chaîne en entrée, que vous utiliseriez en obtenant le targetValue de l'entrée. Plus, onSubmit va généralement sur un élément de formulaire enveloppant les entrées. Pour la plupart, si le compilateur Elm vous indique qu'il recherche une fonction de vue qui a la valeur de retour Html (a -> msg), cela signifie probablement que vous avez manqué un argument quelque part dans la fonction, puisque votre vue devrait normalement être de: , tapez Html Msg (sauf pour les cas plus avancés, bien sûr).

+0

Ahh, je vois la différence maintenant. J'allais enrouler 'onSubmit' dans un formulaire, puisque je ne veux pas déclencher' onInput' mais plutôt appuyer sur une touche Entrée; figuré le moyen le plus facile était de se brancher sur un «onSubmit». – neezer

+1

Pourriez-vous poster un exemple de comment faire cela avec 'onSubmit' s'il vous plait? – neezer