【问题标题】:Confused about "Html msg"对“Html msg”感到困惑
【发布时间】:2023-04-05 00:23:01
【问题描述】:

考虑一下这个sn-p:

type alias Model =
    { x : Int }


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

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

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

【问题讨论】:

标签: elm


【解决方案1】:

你可以有点像对待Generics in Object Oriented programming一样对待msg。尽管概念相似,但这在技术上并不正确。请记住,严格来说,泛型并不是正确的术语。

话虽如此,div 是一个返回值Html 的函数,其“通用”类型为msg(其中msg 可以是任何类型)。这将在 Java 或 C# 中写为Html<A>,其中A 是任何类型的占位符。

Elm 有type inference,所以当testFunc 的返回类型是Html String Elm 推断 msg 因此必须是String 类型。

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

【讨论】:

  • 您介意扩展 elm 和 OO 编程中泛型类型之间的技术差异吗? 替换(OOP)和推断(Elm)类型之间有实际区别吗?它在 elm 指南中被提及为 类型变量,但至少从那里,我看不出有任何区别。提前致谢!
  • 在解释技术差异方面,其他人可能比我做得更好 :) 从概念上讲,我发现它们非常相似。重新类型替换与类型推断:OOP 替换与子类型和类层次结构有关。例如,如果一个方法将Animal 对象作为参数,您也可以使用Dog 对象(假设Dog 类继承自Animal)。而类型推断更多的是关于编译器在没有代码显式设置的情况下计算出一个类型。例如使用let a = "some text",Elm 可以从代码中推断出a 的类型必须为String
  • 好的,有道理。在实践中,我看到的差异是如此之小,以至于这两件事在我的脑海中融合在一起。感谢您的评论
【解决方案2】:

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

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

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

【讨论】:

  • 具体类型的Html String如何接受泛型类型的Html msg
  • 反之亦然。泛型类型Html msg 接受作为Html String 返回,因为msg 实际上可以是任何东西。例如,对于列表函数,它们通常被定义为接受List a,而不是专门定义为List String。这样您就可以将它们与List Int 等一起使用,而无需重新定义新功能。在该主题上结帐this reddit discussion,它可能会对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 2016-09-04
  • 2013-06-02
  • 2019-09-13
  • 2012-07-22
  • 2013-05-13
相关资源
最近更新 更多