对“Html msg”感到困惑

时间:2017-01-13 07:32:34

标签: elm

请考虑以下代码段:

type alias Model =
    { x : Int }


testFunc : Model -> Html String
testFunc model =
    div [] []

我在这里很困惑。 div是一个返回Html msg的函数。但testFunc会返回Html String

这是如何编译的?我错过了一些非常基本的理解吗?

2 个答案:

答案 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。这允许您将它与组件定义的任何消息一起使用,并使其真正通用。