将HTML.App导入为Html

时间:2016-07-21 05:13:22

标签: 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包中的函数?为什么。

4 个答案:

答案 0 :(得分:3)

import Html exposing (Html)

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

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

    import Html.App as Html
    

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

    我通常会避免混淆同样的事情,因为它会让代码混淆我。但编译器处理它没问题。

答案 1 :(得分:2)

这是我的理解......

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

  • Html.xxxx是任意的,无论哪个Html.App模块公开了) 模块xx公开了Html.App(即Html.App.xx)。 它不能单独使用,因为它不是随身携带的 名称间距为单词Html

请注意,句点.只能是名称间距运算符if 左侧单词以大写字母开头。 并且,只有值(必须以小写字母开头)可以具有属性,其中也可以使用.。 (ModuleName.TypeName vs recordValue.property) 所以,它并不含糊。

但是,如果两个模块暴露相同的名称 (例如Html.xxHtml.App.xx) ,然后xx会变得含糊不清 和编译器会抱怨。

例如,使用Html

导入exposing (..)个模块时

我希望它有意义......

答案 2 :(得分:1)

<强> TL; DR:

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

但如果之后有.,那么它就是模块名称,你可以通过HtmlHtml.AppHtml.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程序,这是一种创建优秀代码的模式,可以随着项目的增长而保持良好状态。