当前位置: 首页 > 知识库问答 >
问题:

有可能有一个数据类型只有另一个数据类型的一个构造函数吗?

伯丁雷
2023-03-14

我有一个(相当复杂的)数据类型:

data SomeDataType = Constructor Blah Blah Blah | OtherConstructor Blah Yadda | YetAnotherConstructor Yadda Yadda Tittle | StillOneMoreConstructor Tittle Tattle Wish Wash

现在我发现自己需要另一个数据类型…有两个构造函数。一个与someDataTypeyetanotherConstructor相同;另一个只存储一个double。我有什么选择?

data WantedDataType = ConstructorName1 Double | ConstructorName2 SomeDataType

虽然这会起作用,但它也允许类似ConstructorName2$StilloneMoreConstructorTittle tattle wish Wash这样的东西,这是没有意义的。

data WantedDataType = ConstructorName1 Double | ConstructorName2 Yadda Yadda Tittle
data WantedDataType = ConstructorName1 Double | YetAnotherConstructor Yadda Yadda Tittle

共有1个答案

子车征
2023-03-14

这使我认为YetanotherConstructor实际上“假定”是它自己的数据类型:

data YetAnotherData = YetAnotherConstructor Yadda Yadda Tittle
data SomeDataType   = Constructor Blah Blah Blah
                    | OtherConstructor Blah Yadda
                    | SomeYetAnotherConstructor {-!-}YetAnotherData
                    -- ! will make this EXACTLY isomorphic to the original 
                    -- but is likely unnecessary 
                    | StillOneMoreConstructor Tittle Tattle Wish Wash
data WantedDataType = ConstructorName1 Double
                    | ConstructorName2 {-!-}YetAnotherData

如果说someyeTanotherConstructor(yetanotherConstructor___)ConstructorName2(yetanotherData___)让您很恼火,那么有一个扩展(不过我想您会认为它会让您回到起点):

{-# LANGUAGE PatternSynonyms #-}

pattern SomeYetAnother :: Yadda -> Yadda -> Tittle -> SomeDataType
pattern SomeYetAnother x y z = SomeYetAnotherConstructor (YetAnotherConstructor x y z)
{-# COMPLETE Constructor, OtherConstructor, SomeYetAnother, StillOneMoreConstructor #-}

pattern WantedYetAnother :: Yadda -> Yadda -> Tittle -> WantedDataType
pattern WantedYetAnother x y z = ConstructorName2 (YetAnotherConstructor x y z)
{-# COMPLETE ConstructorName1, WantedYetAnother #-}

这将使someyetotherwantedyetother像数据构造器一样工作(完成覆盖检查(completpragmas)、模式匹配和构造)。当您不关心YetanotherData是每个类型自己的单元时,您可以使用它们对每个类型进行构造/匹配;如果您希望将YetanotherConstructor视为一个单元,则可以使用基础的SomeYetanotherConstructorConstructorName2构造函数。后者可用于例如。

someToWantedByYet :: SomeDataType -> Maybe WantedDataType
someToWantedByYet (SomeYetAnotherConstructor y) = Just $ ConstructorName2 y
someToWantedByYet _ = Nothing
wantedToSomeByYet :: WantedDataType -> Maybe SomeDataType
wantedToSomeByYet (ConstructorName2 y) = Just $ SomeYetAnotherConstructor y
wantedToSomeByYet _ = Nothing
 类似资料:
  • 所以我有这个错误,使用robolectric。

  • 问题内容: 这是一段代码,作为示例,其余的只是方法(迷宫类的底部)。所以当实例化时,使用 和 这将打印出网格阵列。这是合法的吗?我认为所有类都需要构造函数,它如何打印出二维网格数组? 迷宫课: 问题答案: 不需要 显式 定义构造函数;但是,所有类都必须具有构造函数,如果不提供任何默认构造函数,则将生成默认的空构造函数: 请参见默认构造函数。

  • 我知道数据类就像kotlin中的简单模型一样,默认情况下带有getter和setter,并且非常简单: 是否可以为该数据类声明第二个构造函数?

  • 我正试图做到这一点: 然而,类型擦除似乎会去除字符串,所以当我调用时,我会返回一个原始

  • 我的问题是关于OOP(C)中的构造函数。当我在一个类中将默认构造函数定义为private,并且在main中将该类的一个对象初始化为default时,就会出现默认构造函数不可访问的错误。这很好。但我也在Public部分中使用默认参数构造函数,当我再次在main中初始化对象时,就会出现对函数重载的不明确调用。所以我的问题是,如果不能从main访问私有构造函数,那么编译器应该调用公共部分中的构造函数,这

  • 问题内容: 单元测试对我来说是新手,而我却不明白这个错误。我有2个TestCases子类,它们在独立运行时可以正常运行,但在我的测试套件中却不能。 在测试套件(下面的AllTest类)中,前三个可以正常工作,但是AvailableResouresTest和ModelTest会生成错误。 我怀疑这与以下事实有关:我必须在AllTest中导入这两个类(并且只有它们),而它们都位于同一包中。 我使用Ec