例如,来自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提到的一个好点,例如Task
和ProcessId
类型,其构造函数从未在那里使用,但是为什么这些将被分组在这样一个中心是有道理的地点。虽然他的回答并没有解释为什么他们在各自的模块中都有别名(参见上面的Process.Id和Task.Task)。
我想如果没有别名,任何尝试使用模块Task
和Process
的人都必须导入这些特定类型(即Platform.Task
,Platform.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
我认为这证明了我的上述假设,但我不愿意回答我的问题,因为我是榆树的新人,很容易出错。
答案 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)
简而言之,当您希望界面结构与组织实施的方式不同时,我认为您可以这样做。
您可以出于以下几个原因执行此操作,例如:
您希望从多个模块中公开相同的类型,因为它对您的包的使用者更有意义。同时,您必须拥有一个实现,因为从工程角度来看这是有意义的(例如Json.Encode/Decode.Value
)。
您的类型无论如何都是不透明的(意味着构造函数未公开),您只需要它或者希望它定义在与应从中导入的位置不同的位置。
我认为这是Platform.Task
的情况:显然,Evan想要在一个文件中组织所有平台基元。但是,从消费者的角度来看,导入Platform.elm
会很奇怪。感觉就像是向库的使用者公开的实现细节。