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
包中的函数?为什么。
答案 0 :(得分:3)
import Html exposing (Html)
在两个不同的名称空间中公开标识符Html
。
Html.Html
,它只能出现在类型签名中。Html.img
,这指的是紧跟在import
关键字之后的部分。最后,
import Html.App as Html
导入Html.App
模块,并为其提供本地别名Html
。这些不会相互影响,但只要每个模块中的实际函数名称不同,编译器就会为您正确解决这些问题。
我通常会避免混淆同样的事情,因为它会让代码混淆我。但编译器处理它没问题。
答案 1 :(得分:2)
这是我的理解......
如果单独使用Html
,则它指的是定义的类型
在Html
模块内部,它可以单独使用,因为
它由import
指令公开。
(即Html.Html
)
Html.xx
(xx
是任意的,无论哪个Html.App
模块公开了)
模块xx
公开了Html.App
(即Html.App.xx
)。
它不能单独使用,因为它不是随身携带的
名称间距为单词Html
。
请注意,句点.
只能是名称间距运算符if
左侧单词以大写字母开头。
并且,只有值(必须以小写字母开头)可以具有属性,其中也可以使用.
。
(ModuleName.TypeName
vs recordValue.property
)
所以,它并不含糊。
但是,如果两个模块暴露相同的名称
(例如Html.xx
和Html.App.xx
)
,然后xx
会变得含糊不清
和编译器会抱怨。
例如,使用Html
exposing (..)
个模块时
我希望它有意义......
答案 2 :(得分:1)
<强> TL; DR:强>
如果只有Html
,那就是类型(最初Html.Html
)。
但如果之后有.
,那么它就是模块名称,你可以通过Html
从Html.App
和Html.something
模块中获取定义}。
更详细:
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.elm
module A exposing (x)
x = "x from A"
B.elm
module B exposing (x)
x = "x from B"
C.elm
module C exposing (..)
import A
import B as A
import Html
main = Html.text A.x
答案 3 :(得分:0)
import Html.App as App
它基本上从html包导入应用程序。这些函数将帮助您设置一个遵循Elm Architecture的Elm程序,这是一种创建优秀代码的模式,可以随着项目的增长而保持良好状态。