将 HTML.App 导入为 Html

  • 本文关键字:Html 导入 App HTML elm
  • 更新时间 :
  • 英文 :


http://guide.elm-lang.org/architecture/user_input/buttons.html 的榆树教程有以下几行:

import Html exposing (Html, button, div, text)
import Html.App as Html

我不明白这些导入的结果Html名称所引用的内容。是Html.App还是Html包中的功能?以及为什么。

import Html exposing (Html)

公开标识符Html在两个不同的命名空间中。

  1. 来自括号部分的 HTML 是一种类型。它的限定名称是Html.Html,它只能出现在"类型签名"中。
  2. 只能作为限定符出现的 Html 模块。因此,您可以编写Html.img,这是指紧跟在import关键字之后的部分。

最后

import Html.App as Html

导入Html.App模块,并为其提供本地别名 Html 。这些不会相互遮蔽,但只要每个模块中的实际函数名称不同,编译器就会为您正确解决这些问题。


我通常避免混叠到同一件事,因为它会使代码让我感到困惑。但是编译器处理它没有问题。

这是我

的理解...

  • 如果单独使用 Html则它引用定义的类型在Html模块内部,它可以单独使用,因为它由import指令公开。(即 Html.Html (

  • Html.xx(xx是任意的,无论模块暴露Html.App(xx由模块Html.App公开(即 Html.App.xx (。而且它不能单独使用,因为它不是与带有单词Html的名称间距。

请注意,句点.只能在以下情况下是名称间距运算符左侧单词以大写字母开头。而且,只有值(必须以小写字母开头(才能具有属性,其中也可以使用.。( ModuleName.TypeNamerecordValue.property (所以,它不是模棱两可的。

但是,如果两个模块公开相同的名称(例如 Html.xxHtml.App.xx(,那么xx可能会变得模棱两可编译器会抱怨。

例如,当Html模块与exposing (..)一起导入时

我希望这是有道理的...

TL;DR:

如果只有Html,那就是类型(最初是Html.Html(。

但是,如果它后面有.,它是一个模块名称,您可以通过执行Html.somethingHtmlHtml.App模块中获取定义。


更详细:

import Html的结果是您可以访问 Html.whateverHtmlExposes .

exposing (Html, button, div, text)的结果是你可以写

  • Html而不是Html.Html(类型(,
  • button而不是Html.button(函数(,
  • 等。

import Html.App的结果是您可以访问Html.App.whateverHtmlAppExposes但是由于as Html部分,您现在可以像Html.whateverHtmlAppExposes一样编写它。

不要担心冲突 - 在这种情况下,编译器会警告您:

-- NAMING ERROR ---------------------------------------------------------- C.elm
This usage of variable `A.x` is ambiguous.
9|     Html.text A.x
                 ^^^
Maybe you want one of the following?
    A.x
    B.x
Detected errors in 1 module.

在这里我导入了B作为A,两个模块都x公开:

A.榆树

module A exposing (x)
x = "x from A"

B.榆树

module B exposing (x)
x = "x from B"

C.榆树

module C exposing (..)
import A
import B as A
import Html
main = Html.text A.x

import Html.App as App

它基本上从html包导入应用程序。这些函数将帮助您设置遵循 Elm 架构的 Elm 程序,Elm 架构是一种用于创建出色代码的模式,随着项目的增长而保持出色。

最新更新