在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
,并根据它是否提供返回略有不同的类型。我该怎么做呢?我这样做完全错了吗?
答案 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/,这将让您了解为什么不同的数据结构构建方式等等,以及其他见解。