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