私はエルムの新人です。私はこれまでのところ本当に好きですが、私は私の頭を包み込むことができないという問題にぶつかってきました。Transform Html DOM
私は[1-6]要素の各時間内のリンクを追加しますので、(それをシンプルに保つこと)のようなものにそれを変換したい
div []
[ h1 [] [text "Headline 1"]
, p [] [text "Some text"]
, h2 [] [text "Headline 2"]
]
例えば私は、HTML DOMを持っている
div []
[ h1 [] [ text "Headline 1"
, [a [name "headline"] [text "#"]
]
, p [] [text "Some text"]
, h2 [] [text "Headline 2"
, [a [name "headline"] [text "#"]
]
]
これは概念的にはあまり難しくありません。要素がh [1-6]の場合、DOMを見て、a-linkを子要素として追加します。しかし、エルムの私の理解はそれを働かせるほど十分ではありません。
これまで私がこれまで試みてきたことは次のとおりです。
transform : Html a -> Html a
transform node =
-- check if the tag is h1-h6
case node.tag of
-- add a-link to h1 children
"h1" -> { node | children = (a [name "headline"] [text "#") :: node.children }
"h2" -> { node | children = (a [name "headline"] [text "#") :: node.children }
-- do this for all nodes in the tree
_ -> { node | children = List.map transform node.children }
これは機能しません。
The type annotation for `transform` does not match its definition.
40| transform : Html a -> Html a
^^^^^^^^^^^^^^^^
The type annotation is saying:
VirtualDom.Node a -> VirtualDom.Node a
But I am inferring that the definition has this type:
{ b | tag : String, children : List (Html a) }
-> { b | children : List (Html a), tag : String }
私は、ジェネリック型a
は、そのフィールドを持っていない可能性がありますので、私はnode.tag
を行うことができないことを理解しています。タイプセーフではありません。たとえば、テキストノードにタグフィールドはありませんが、まだHtml.Html a
のインスタンスです。
> text "Hello World"
{ type = "text", text = "Hello World" } : Html.Html a
私の質問は、どうすればいいですか?これはできますか?私はこれをしてはいけませんか?
を私は出力がjavascriptのあったことを疑いました。私の "Html msg"は 'Markdown 'の出力に由来します。toHtml'から 'Html msg'として返される前に、それを操作する良い方法はありません。出力を変換することができないほど悪いです。 –