在Haskell数据类型中表示国家ID和文本

时间:2018-01-21 16:50:06

标签: haskell aeson gadt

我在json中有一个国家/地区ID和国家/地区文本列表

{
 1 : "country one",
 2 : "country two"
}

我创建了以下代码来表示haskell中的国家/地区ID和文本

data Country a = Country a

country1 :: Country String -- Representing country name
country1 = Country "country one"

country2 :: Country Integer -- Representing country id
country2 = Country 2 

以上代码工作正常。但是我想把 a 的约束只取值String和Integer。

为此,我尝试了下面的代码。但是,它无法正常工作。

{-# LANGUAGE GADTs #-}
data Country a where
    Country :: (String, Integer) => a -> Country a

toId :: Country String -> Country Integer
toId Country a = Country 1

toText :: Country Integer -> Country String
toText Country a = Country "country one"

任何人都可以帮助弄清楚如何以最佳方式实现上述代码,以便它能够正常工作吗?

1 个答案:

答案 0 :(得分:0)

GADT对于这项任务来说太过分了,IMO。

你不能只使用ADT吗?

data Country = CountryWithInt Int
             | CountryWithString String