Module 为什么“type alias”是在另一个模块中以相同方式定义的类型?
例如,从以下文件: 或从来源:Module 为什么“type alias”是在另一个模块中以相同方式定义的类型?,module,elm,type-alias,Module,Elm,Type Alias,例如,从以下文件: 或从来源: type alias Task x a = Platform.Task x a 我假设答案是,可以从定义为自己的模块中公开它。这是正确的吗 更新: Chad Gilbert提出了一个很好的观点,例如任务和进程ID类型,它们的构造函数从未在那里使用过,但为什么这些类型会被分组在这样一个中心位置是有道理的。尽管他的回答没有解释为什么它们在各自的模块中都有别名(请参见上面的和Task.Task) 我猜,如果没有别名,任何试图使用模块的人都必须导入这些特定类型(即
type alias Task x a =
Platform.Task x a
我假设答案是,可以从定义为自己的模块中公开它。这是正确的吗
更新:
Chad Gilbert提出了一个很好的观点,例如
任务
和进程ID
类型,它们的构造函数从未在那里使用过,但为什么这些类型会被分组在这样一个中心位置是有道理的。尽管他的回答没有解释为什么它们在各自的模块中都有别名(请参见上面的和Task.Task)
我猜,如果没有别名,任何试图使用模块的人都必须导入这些特定类型(即,Platform.Task
,Platform.ProcessId
),因为默认情况下不会导入它们(请参阅)
更新_2:
模块中还有另一个示例: 我认为这证明了我的上述假设,但我不愿意回答我的问题,因为我是Elm的新手,很容易出错。来自以下文档: 有关更多信息,请参阅本模块的文档 这方面的信息。这里之所以定义它,是因为它是一个平台 原始的 其定义如下:
type Task err ok=Task
。。。这并不能告诉我们太多<代码>任务是一种不透明类型,其内部的
任务
构造函数从不使用。它是Elm体系结构中的基本原语之一,基于上述评论,似乎只在平台中定义,因为它是以平台为中心的原语的方便分组。简言之,我认为当您希望界面的结构与您希望组织实现的方式不同时,您可以这样做
您可以这样做有几个原因,例如:
您希望从多个模块公开同一类型,因为这样对包的使用者更有意义。同时,您必须有一个单一的实现,因为从工程的角度来看,这是有意义的(比如Json.Encode/Decode.Value
)
您的类型无论如何都是不透明的(这意味着构造函数没有公开),您只需要它或者希望它被定义在一个与导入位置不同的地方。
我认为这就是平台任务的情况:显然,Evan希望将所有平台原语组织在一个文件中。然而,从消费者的角度来看,导入Platform.elm
会很奇怪。这就像是一个向库的消费者公开的实现细节
感谢您提到Platform.Task
,我本应该把它放在我的问题中,但我试图理解在任务
模块中输入别名的意义。我猜所有的基元类型都是在平台中定义的,并且在它们自己的模块中使用别名,这样就不必通过它们的全名引用它们,并且它们可以由它们的模块导出。(这同样适用于和)。
type alias Task x a =
Platform.Task x a
-- From the docs:
type alias Value =
Value
-- From the source:
type alias Value = JsEncode.Value