Elm 困惑于;Html msg";

Elm 困惑于;Html msg";,elm,Elm,考虑一下这个片段: type alias Model = { x : Int } testFunc : Model -> Html String testFunc model = div [] [] 我在这里很困惑div是一个返回Html msg的函数。但是testFunc返回Html字符串 这是如何编译的?我是否遗漏了一些非常基本的理解?请记住小写和大写类型定义之间的差异。div签名中的小写msg为泛型。它可以被命名为a,或者任何以小写开头的东西 在您对testFu

考虑一下这个片段:

type alias Model =
    { x : Int }


testFunc : Model -> Html String
testFunc model =
    div [] []
我在这里很困惑
div
是一个返回
Html msg
的函数。但是
testFunc
返回
Html字符串


这是如何编译的?我是否遗漏了一些非常基本的理解?

请记住小写和大写类型定义之间的差异。
div
签名中的小写
msg
为泛型。它可以被命名为
a
,或者任何以小写开头的东西

在您对
testFunc
的定义中,您只是使用返回类型为
String
div
,这对elm编译器来说不是问题:这很可能是您的
Msg
类型

换句话说,
div
的返回类型不是
Html-Msg
,而是
Html-Msg
。这允许您将其用于组件定义的任何消息,并使其真正通用。

您可以像对待
msg
一样对待它。这在技术上是不正确的,尽管概念是相似的。请记住,严格来说,泛型并不是正确的术语

话虽如此,
div
是一个返回值
Html
的函数,其“通用”类型为
msg
(其中
msg
可以是任何类型)。这将被写为
Html,因此当
testFunc
的返回类型为
Html字符串时,Elm推断
msg
因此必须是
String
类型


另请注意,Elm要求泛型类型为小写(例如
msg
)。Elm代码中经常会出现混淆,因为人们通常会定义一个真正类型的
Msg
,并将通用占位符类型命名为
Msg

,一个具体类型的
Html字符串
如何接受
Html Msg
这是一个通用类型?这是另一种方式。泛型类型
Html-msg
接受作为
Html字符串
返回,因为
msg
实际上可能是任何东西。例如,对于列表函数,它们通常被定义为接受
列表a
,而不是专门定义为
列表字符串
。通过这种方式,您可以将它们与
列表Int
等一起使用。。。无需重新定义新函数。关于这个主题,它可能会对你有所帮助。你介意扩展一下elm和OO编程中泛型类型之间的技术区别吗?替换(OOP)和推断(Elm)类型之间有实际区别吗?在elm指南中提到它是一个类型变量,但至少从那里,我看不出有什么不同。提前谢谢!在解释技术差异方面,其他人可能会比我做得更好:)不过,在概念上,我发现它们非常相似。重类型替换vs类型推断:OOP替换涉及子类型和类层次结构。例如,如果方法将
动物
对象作为参数,则还可以使用
对象(假设
类继承自
动物
)。而类型推断更多的是编译器在没有代码显式设置的情况下计算类型。例如,通过使用
let a=“some text”
,Elm可以从代码推断
a
必须是
String
类型,这是有意义的。在实践中,我几乎看不出有什么不同,以至于这两件事在我的脑海中融合了。感谢您的评论: