目前,我有一个只显示错误文本的嵌套组件。 view方法接收Model
并返回Html
,但编译器抱怨说Html需要另一个值,所以我最终这样做了:
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
我不喜欢的是我必须在签名中添加()
值。有没有办法摆脱这个?
谢谢!
答案 0 :(得分:4)
Html
type只需要一个参数,因此您必须提供某些内容。使用()
作为类型参数是在其中放置虚拟值的常用方法。
您始终可以定义类型别名,以避免每次都输入()
:
type alias OnlyHtml = Html ()
然后你可以适当地改变你的类型签名:
view: Model -> OnlyHtml
答案 1 :(得分:2)
使用Html ()
会使您更难以使用执行发送消息的视图撰写此视图。相反,请使用类型变量:view: Model -> Html msg
。
小写m
非常重要:它意味着此HTML可以发送任何类型的消息。除此之外,发送未知类型的消息会破坏类型系统,因此它不能发送任何消息。如果这看起来很奇怪,请考虑x : List a
表示x
的元素是任意类型的,因此没有这样的元素:x == []
。
使用type变量是函数的最常用类型。您使用()
代替的是提供更具体的注释,这是允许的。它就像声称空列表实际上是一个字符串列表一样:当然,但是你所做的一切使得这个值对于需要另一个类型列表的函数来说是不可接受的。我的意思是Html ()
很难在没有其他观点的情况下撰写。
viewMsg : Html Msg
viewUnit : Html ()
viewTypeVariable : Html msg
views = [viewMsg, viewTypeVariable] -- This is okay
views = [viewMsg, viewUnit] -- This is a type error!