为什么`type alias`是在另一个模块中以相同方式定义的类型?

时间:2018-05-13 18:04:39

标签: module elm type-alias

例如,来自Task type in the Task module的文档:

type alias Task err ok =
  Task err ok

或者来自消息来源:

type alias Task x a =
  Platform.Task x a

我假设答案是可以将它从被定义为自己的模块中公开。这是对的吗?

更新:
Chad Gilbert提出了Platform primitives提到的一个好点,例如TaskProcessId类型,其构造函数从未在那里使用,但是为什么这些将被分组在这样一个中心是有道理的地点。虽然他的回答并没有解释为什么他们在各自的模块中都有别名(参见上面的Process.Id和Task.Task)。

我想如果没有别名,任何尝试使用模块TaskProcess的人都必须导入这些特定类型(即Platform.TaskPlatform.ProcessId),因为默认情况下不会导入它们(请参阅Elm's default imports)。

UPDATE_2:
另一个示例是Value模块中的Json.Decode module

-- From the docs:
type alias Value = 
    Value

-- From the source:
type alias Value = JsEncode.Value

我认为这证明了我的上述假设,但我不愿意回答我的问题,因为我是榆树的新人,很容易出错。

2 个答案:

答案 0 :(得分:4)

来自Platform.Task的文档:

  

转到Task模块的文档了解更多信息   关于此的信息。它只在这里定义,因为它是一个平台   原始

它被定义为:

Task

......这并没有真正告诉我们多少。 Task是一个opaque类型,从不使用其内部Platform构造函数。它是Elm Architecture中的基本原语之一,基于上面的注释,似乎只在> require(data.table) > have <- data.table(ID = c(1,1,1,2,2) + , colA = c("A","B","A","A","A") + , colB = c("C","A","B","B","C")) > have ID colA colB 1: 1 A C 2: 1 B A 3: 1 A B 4: 2 A B 5: 2 A C > want <- data.table(ID = c(1,2), UnN = c(3,3)) > want ID UnN 1: 1 3 2: 2 3 中定义,因为它是一个方便的以平台为中心的原语组合。

答案 1 :(得分:0)

简而言之,当您希望界面结构与组织实施的方式不同时,我认为您可以这样做。

您可以出于以下几个原因执行此操作,例如:

  1. 您希望从多个模块中公开相同的类型,因为它对您的包的使用者更有意义。同时,您必须拥有一个实现,因为从工程角度来看这是有意义的(例如Json.Encode/Decode.Value)。

  2. 您的类型无论如何都是不透明的(意味着构造函数未公开),您只需要它或者希望它定义在与应从中导入的位置不同的位置。 我认为这是Platform.Task的情况:显然,Evan想要在一个文件中组织所有平台基元。但是,从消费者的角度来看,导入Platform.elm会很奇怪。感觉就像是向库的使用者公开的实现细节。

相关问题