在列表中的类型变体上创建条件

时间:2019-04-13 04:38:32

标签: elm

所以我在列表中有一些类型变量:

type VariableType
    = BooleanVariable
    | ContinuousVariable
    | CategoricalVariable
    | Incorrect

mylistone = [ContinuousVariable, ContinuousVariable, ContinuousVariable]
mylisttwo = [ContinuousVariable, ContinuousVariable, CategoricalVariable]

我需要这样定义一个函数:

listtype : List VariableType -> VariableType
listtype list =
    -- if (List.all isBooleanVariable list) then 
        BooleanVariable
    -- else if (List.all isContinuousVariable list) then 
        ContinuousVariable
    -- else
        CategoricalVariable

因此,上面定义的这两个列表上的输出应为:

listtype mylistone -- ContinuousVariable
listtype mylisttwo -- CategoricalVariable

但是我读到由于类型擦除,不可能在编译类型之后检查类型。如何定义isBooleanVariableisContinuousVariable

1 个答案:

答案 0 :(得分:6)

BooleanVariableContinuousVariable等都是自定义类型VariableType的所有变体,并产生或表示值。因此,您实际上并没有尝试检查这些类型,它们都具有类型VariableType,只是它们的值。可以使用等于运算符以及其他任何可比较的值来完成此操作:

listtype : List VariableType -> VariableType
listtype list =
    if (List.all (\v -> v == BooleanVariable) list) then 
        BooleanVariable
    else if (List.all ((==) ContinuousVariable) list) then 
        ContinuousVariable
    else
        CategoricalVariable