请考虑以下代码段:
type alias Model =
{ x : Int }
testFunc : Model -> Html String
testFunc model =
div [] []
我在这里很困惑。 div
是一个返回Html msg
的函数。但testFunc
会返回Html String
。
这是如何编译的?我错过了一些非常基本的理解吗?
答案 0 :(得分:9)
您可以点那种对msg
div
进行处理。虽然概念类似,但这在技术上并不正确。请记住,通用术语严格来说并不是正确的术语。
话虽如此,Html
是一个返回msg
值的函数,其中'{generic'类型为msg
(其中Html<A>
可以是任何类型)。这将在Java或C#中写为A
,其中testFunc
是任何类型的占位符。
Elm有Generics in Object Oriented programming,因此当Html String
的返回类型为msg
时,Elm 推断 String
必须为{{1}输入。
另请注意,Elm要求泛型类型为小写(例如msg
)。它经常在Elm代码中令人困惑,因为人们通常会定义一个真实的Msg
类型,并将通用占位符类型命名为msg
。
答案 1 :(得分:4)
请记住小写和大写类型定义之间的区别。 msg
签名中的小写div
是泛型类型。它可以被命名为a
,或者以小写字母开头的任何其他内容。
在testFunc
的定义中,您只是使用返回类型为div
的{{1}},这对于elm编译器来说不是问题:这很可能是您的String
类型。
换句话说,Msg
的返回类型不是 div
,而是Html Msg
。这允许您将它与组件定义的任何消息一起使用,并使其真正通用。