Haskell可选类型参数

时间:2018-02-19 19:52:24

标签: haskell parameterized-types

在haskell中,如何定义可选的类型参数:

data Car a b c = Car { company :: a
                     , model :: b
                     , year :: c  
                     }
-- I want to return this type if `c` is not provided
data Car a b = Car { company :: a  
                   , model :: b
                   }

在上面,我想要一个可选类型c,并根据它是否提供返回略有不同的类型。我该怎么做呢?我这样做完全错了吗?

1 个答案:

答案 0 :(得分:6)

根据您的具体要求,我会熟悉不同的方法。但首先,我不清楚您是否希望对这些类型进行参数化。即我怀疑你真正想要的是:

data Car = Car { company :: Company
               , model :: String
               , year :: Int  
               }

特别是您似乎不太可能需要year的单独表示。如果是这种情况,那么您的问题的答案(如何使年份可选:

data Car = Car { company :: Company
               , model :: String
               , year :: Maybe Int -- N.B. Maybe  
               }

如果您真的要求参数化类型是可选的,那么您可以这样做:

data Foo a = Foo Int Char a

然后,当您希望将其视为“没有最后一个参数的Foo”时,可以将其用作Foo ()。如果需要,你可以进一步在它周围创建一个newtype包装。

newtype FooWithoutA = FooWithoutA (Foo ())

由于单位类型()只有一个值,因此表示该字段中没有任何内容。

除此之外:您也可能有兴趣阅读http://chris-taylor.github.io/blog/2013/02/10/the-algebra-of-algebraic-data-types/,这将让您了解为什么不同的数据结构构建方式等等,以及其他见解。