有没有那么繁琐的方法来解开仅带有单个标签的类型,例如目前我正在case myObject of TheTag arg -> foo
,但是我在想编译器应该足够聪明,知道只有一种可能性,对吧?
答案 0 :(得分:4)
没有内置的编译器快捷方式可以消除从单个构造函数类型“解包”有效负载的需求。您始终可以为此目的定义一个getter函数,以避免出现case语句:
getTagArg (TheTag arg) = arg
然后,当您需要在代码中使用它时,只需调用getTagArg myObject
而不是case语句。
答案 1 :(得分:2)
编译器 足够聪明,可以知道只有一种可能性,但是仍然必须区分包装和未包装的值,因为至少它们是不同的类型。
可以在可以使用任何模式的任何地方展开单个标签自定义类型,或更准确地对其进行解构,就像在对记录或元组进行解构时一样。
您可以按照所示,在case
表达式中对其进行解构,并作为函数自变量
myFunction (TheTag arg) = ...
但也包含在let绑定中
let TheTag arg = myObject in ...
如果您尝试使用具有多个标签的自定义类型来执行此操作,则编译器会告诉您“此模式未涵盖所有可能的值”。但是,如果该类型仅包含一个标签,则可以正常工作,因为确实覆盖了所有可能的值,并且编译器 足够聪明,可以识别出来。