在 Elm 0.18 中公开的模块

Module exposing in Elm 0.18

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

module Types exposing (..)

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

module Types exposing (Foo, Bar, Baz)

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

这两种方法有什么区别?

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

module Types exposing (Msg (..))

type Msg = FirstAction | SecondAction | ThirdAction

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

import Types exposing (Msg (..))

请参阅 GitHub issue #968 以了解联合类型为何需要这样做的解释。

看看这个类型定义:

    type Foo
        = Foo
        | Baz
        | Quux

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

如你所写

    import Types exposing (Foo)

您正在导入 类型构造函数 Foo 。要导入 Foo 的数据构造函数,您必须在导入类​​型构造函数后在括号中明确地执行此操作:

    import Types exposing (Foo (Foo, Baz))

或者,如果您想导入该类型的所有数据构造函数:

    import Types exposing (Foo (..))