让我们假设这两种总和类型
data Currency =
| GBP
| EUR
| DKK
data Country =
| DE
| AT
| DK
| UK
Run Code Online (Sandbox Code Playgroud)
和以下产品类型
type CC = (Country, Currency)
Run Code Online (Sandbox Code Playgroud)
现在即使所有这些国家都是欧盟的一部分(是的,亲爱的软件考古学家从3000年开始 - 英国曾经是欧盟的一部分;-))他们有不同的货币(或不是).所以我想限制的可能值CC,以
(DE, EUR)
(AT, EUR)
(UK, GBP)
(DK, DKK)
Run Code Online (Sandbox Code Playgroud)
并使其他所有组合都不可表达.
是否有可能在类型级别上表达这样的东西?
如果不是,那么精通Haskeller的方法怎么会这样呢?
这可能有点过分,但根据您所处的环境,您可以使用GADT.这至少取决于您的至少您的货币没有任何构造函数信息.
{-# LANGUAGE GADTs, DataKinds #-}
data Currency = GBP | EUR | DKK
data Country c where
DE :: Country EUR
AT :: Country EUR
UK :: Country GBP
DK :: Country DKK
Run Code Online (Sandbox Code Playgroud)
或者,我认为一个变体可能不太有用但更接近问题
{-# LANGUAGE GADTs, DataKinds #-}
data Currency = GBP | EUR | DKK
data Country = DE | AT | DK | UK
data CountryCurrency country currency where
DECC :: CountryCurrency DE EUR
ATCC :: CountryCurrency AT EUR
UKCC :: CountryCurrency UK GBP
DKCC :: CountryCurrency DK DKK
Run Code Online (Sandbox Code Playgroud)
没有用例,很难说最好的方法是什么.:)