【问题标题】:Module exposing in Elm 0.18在 Elm 0.18 中公开的模块
【发布时间】:2017-09-10 00:37:43
【问题描述】:

我有一个类型的 elm 模块,它由类型和类型别名 Foo、Bar 和 Baz 组成。当我像这样导出所有内容时,代码可以工作:

module Types exposing (..)

但是,如果我明确包含所有类型,代码就会中断。

module Types exposing (Foo, Bar, Baz)

消费文件上的导入语句也是如此;两者都需要exposing (..)

这两种方法有什么区别?

【问题讨论】:

  • 您能否举例说明如何定义这些类型。这可能很重要的一个例子是,联合类型具有包含标签/数据构造函数的特殊语法。
  • @jpierson 所有编译器错误都来自我尝试导出Msg。我正在尝试像任何其他类型一样导出Msg,并将其定义为type Msg = FirstAction | SecondAction | ThirdAction...,但它在我的代码中找不到这些操作。

标签: types elm


【解决方案1】:

我最近才自己学习 Elm,但听起来好像因为您的一种类型 (Msg) 被定义为联合类型,因此在导出此类型时需要使用 Msg(..) 语法。

module Types exposing (Msg (..))

type Msg = FirstAction | SecondAction | ThirdAction

或者在导入联合类型的情况下。

import Types exposing (Msg (..))

请参阅 GitHub issue #968,了解为什么联合类型需要这样做。

【讨论】:

    【解决方案2】:

    看看这个类型定义:

        type Foo
            = Foo
            | Baz
            | Quux
    

    您会看到两个Foo:前一个是类型构造函数,后者是数据构造函数。类型构造函数和数据构造函数位于不同的命名空间中,因此您可以为两者使用相同的名称。

    如你所愿

        import Types exposing (Foo)
    

    您正在导入 类型构造函数 Foo 。要导入Foo的数据构造函数,必须在类型构造函数导入后的括号中显式地进行:

        import Types exposing (Foo (Foo, Baz))
    

    或者,如果要导入此类型的所有数据构造函数:

        import Types exposing (Foo (..))
    

    【讨论】:

      猜你喜欢
      • 2018-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多