我有一个类型的elm模块,它由类型和类型别名Foo,Bar和Baz组成。当我导出所有这样的代码时,代码可以工作:
module Types exposing (..)
但是,如果我明确包含所有类型,则代码会中断。
module Types exposing (Foo, Bar, Baz)
消费文件上的import语句也是如此;两者都需要exposing (..)
这两种方法有什么区别?
答案 0 :(得分:8)
我最近才自己学习榆树,但听起来好像你的一个类型(Msg
)被定义为一个联合类型,你需要使用Msg(..)
语法导出此类型时。
module Types exposing (Msg (..))
type Msg = FirstAction | SecondAction | ThirdAction
或者导入联合类型。
import Types exposing (Msg (..))
请参阅GitHub issue #968,了解为什么工会类型需要这样做。
答案 1 :(得分:3)
查看此类型定义:
Foo
您会看到两个 import Types exposing (Foo)
:前一个是类型构造函数,后者是数据构造函数。类型构造函数和数据构造函数位于不同的名称空间中,因此您可以为两者使用相同的名称。
写作时
Foo
您要导入类型构造函数 Foo
。要导入 import Types exposing (Foo (Foo, Baz))
的数据构造函数,必须在导入类型构造函数后在括号中显式地执行此操作:
import Types exposing (Foo (..))
或者,如果要导入此类型的所有数据构造函数:
v::optional(v::Phone())->validate($phoneNumber);