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
类型,这是有意义的。在实践中,我几乎看不出有什么不同,以至于这两件事在我的脑海中融合了。感谢您的评论: