【发布时间】:2019-07-30 17:27:18
【问题描述】:
我有类型Model,它描述了泛型别名ModelFields 的两种可能状态。我想从Model 类型的实例中提取通用ModelFields 记录。
type Model endValue stats
= ShowEndValues (ModelFields Organism endValue)
| ShowStatistics (ModelFields Rank stats)
type alias ModelFields object results =
{ results : List results
, objects : List object
, cellValue : results -> String
, location : Maybe (Rank, Rank)
}
getModelFields : Model endValue stats -> ModelFields object results
getModelFields model =
case model of
ShowEndValues modelFields ->
modelFields
ShowStatistics modelFields ->
modelFields
但 Elm 不允许它对每个 case 表达式都说
TYPE MISMATCH - Something is off with the 1st branch of this `case` expression:
55| modelFields
#^^^^^^^^^^^#
This `modelFields` value is a:
ModelFields #Organism# #endValue#
But the type annotation on `getModelFields` says it should be:
ModelFields #object# #results#
#Hint#: Your type annotation uses type variable `object` which means ANY type of
value can flow through, but your code is saying it specifically wants a
`Organism` value. Maybe change your type annotation to be more specific? Maybe
change the code to be more general?
所以我的问题是:我如何从Model 获得ModelFields?还是我在做一些根本上存在缺陷的事情?
UPD。我正在尝试建模的详细信息。
我有Organism 类型的对象。它们被分组为Ranks。我的服务器对Organisms 进行了一些成对分析,例如在两个Organisms 之间计算Similarity 和Distance。我想在不同页面的两个表中显示这些分析的结果,一页用于Similarity 分析,另一页用于Distance 分析。这意味着该表应该可重复使用以接受任何形式的分析结果。
另一方面,这些表有一个共同的模式。它们可以处于两种状态:
- 显示
Organisms 之间成对比较的具体结果(Model中的endValue),因此表格的行和列代表Organisms。 - 在
Organisms 的组 (Ranks) 之间显示统计值(例如,平均值或标准差,statsinModel),在这种情况下,表格的行和列代表Ranks。
显示哪个Ranks 或Organisms 取决于ModelFields 的location 字段。用户可以单击一个按钮,我想在我的update 函数中更改location。此导航更改可能会在ShowEndValues 和ShowStatistics 状态之间切换。这就是为什么我试图从Model 构造函数中解开ModelFields。我附上一个简单的插图,希望它有助于澄清。
【问题讨论】:
-
这是an XY problem。你试图做的事情是不可能的,不清楚你想在更高的层次上完成什么,为什么你做出了你做出的选择来达到这个目标,主要是因为不清楚你为什么需要所有这些类型变量。如果您能解释这一点,则可能会建议您改用什么方法,但除此之外,很难给出“不,行不通”以外的答案,并像 Jan 那样详细说明其技术原因。
标签: types elm algebraic-data-types unification parametric-polymorphism