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
在两个不同的命名空间中。
- 来自括号部分的 HTML 是一种类型。它的限定名称是
Html.Html
,它只能出现在"类型签名"中。 - 只能作为限定符出现的 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.TypeName
与 recordValue.property
(所以,它不是模棱两可的。
但是,如果两个模块公开相同的名称(例如 Html.xx
和Html.App.xx
(,那么xx
可能会变得模棱两可编译器会抱怨。
例如,当Html
模块与exposing (..)
一起导入时
我希望这是有道理的...
TL;DR:
如果只有Html
,那就是类型(最初是Html.Html
(。
但是,如果它后面有.
,它是一个模块名称,您可以通过执行Html.something
从Html
和Html.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 架构是一种用于创建出色代码的模式,随着项目的增长而保持出色。