2016-05-16 4 views
2

現在、エラーテキストのみを表示するネストされたコンポーネントがあります。ビューの方法はModelを受け取り、Htmlを返しますが、コンパイラは、HTMLが別の値を必要とするので、私はこれをやってしまったと言って文句を言う:Elm:メッセージを返さないビューを作成する方法は?

view: Model -> Html() 
view error = 
    div [class "docs-section error-bar"] [ 
     errorText error 
    ] 

errorText: Model -> Html() 
errorText error = 
    case error.text of 
    Nothing -> span [][] 
    Just value -> text value 

私は好きではない何かが、私は()値を追加することが必要であることです署名に。私はこれを取り除く方法がありますか?

ありがとうございます!

答えて

4

Html typeには1つのパラメータが必要なので、常にの何かをとする必要があります。型パラメータとして()を使用するのは、そこにダミー値を入れる一般的な方法です。

type alias OnlyHtml = Html() 

次に、あなたが適切にあなたのタイプの署名を変更することができます:あなたは常に()を毎回入力して回避するために、型の別名を定義することができ

view: Model -> OnlyHtml 
+0

ありがとうございます!私はエイリアス名が好きです。 =) – afcastano

2

Html()を使用するには、それが困難のためになりますdoメッセージを送信するビューでこのビューを作成します。代わりに、タイプ変数:view: Model -> Html msgを使用してください。

小文字のmは非常に重要です。つまり、このHTMLはあらゆる種類のメッセージを送信できます。それ以外は、タイプが不明なメッセージを送信すると型システムが壊れるため、メッセージを送信してはいけません。これが奇妙に思える場合、x : List aは、xの要素が任意の型であることを意味し、したがって、そのような要素はありません:x == []

変数の型の使用は、関数の最も一般的な型です。代わりに()を使ってやっているのは、許可されているより具体的な注釈です。空リストは実際には文字列のリストであると主張するのと同じですが、あなたがしたことはすべて、その値を別の型のリストを期待する関数に受け入れられないものにします。これは私がHtml()で意味することは他のビューなしで作成するのが難しいです。

viewMsg : Html Msg 
viewUnit : Html() 
viewTypeVariable : Html msg 

views = [viewMsg, viewTypeVariable] -- This is okay 
views = [viewMsg, viewUnit] -- This is a type error! 
関連する問題