有没有办法限制可能的产品类型的实例?

rob*_*kuz 2 haskell types

让我们假设这两种总和类型

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的方法怎么会这样呢?

Ale*_*lec 8

这可能有点过分,但根据您所处的环境,您可以使用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)

没有用例,很难说最好的方法是什么.:)