是否有一种不太冗长的方法来仅用单个标签解开类型?

时间:2019-03-04 13:26:57

标签: pattern-matching elm algebraic-data-types

有没有那么繁琐的方法来解开仅带有单个标签的类型,例如目前我正在case myObject of TheTag arg -> foo,但是我在想编译器应该足够聪明,知道只有一种可能性,对吧?

2 个答案:

答案 0 :(得分:4)

没有内置的编译器快捷方式可以消除从单个构造函数类型“解包”有效负载的需求。您始终可以为此目的定义一个getter函数,以避免出现case语句:

getTagArg (TheTag arg) = arg

然后,当您需要在代码中使用它时,只需调用getTagArg myObject而不是case语句。

答案 1 :(得分:2)

编译器 足够聪明,可以知道只有一种可能性,但是仍然必须区分包装和未包装的值,因为至少它们是不同的类型。

可以在可以使用任何模式的任何地方展开单个标签自定义类型,或更准确地对其进行解构,就像在对记录或元组进行解构时一样。

您可以按照所示,在case表达式中对其进行解构,并作为函数自变量

myFunction (TheTag arg) = ...

但也包含在let绑定中

let TheTag arg = myObject in ...

如果您尝试使用具有多个标签的自定义类型来执行此操作,则编译器会告诉您“此模式未涵盖所有可能的值”。但是,如果该类型仅包含一个标签,则可以正常工作,因为确实覆盖了所有可能的值,并且编译器 足够聪明,可以识别出来。