如何将可选属性附加到值?

int*_*tar 4 haskell types variant

我想存储一些"东西"列表,它们可以附加一些可选的额外属性.每件事物都可以有一个或多个属性.不同的属性有不同的类型.

我希望能够在代码中简明扼要地创建这些事物的文字列表.但是我很难看到如何通过类型系统,因为元组允许类型的混合但是固定长度,而列表是可变长度但是一种类型.

这是我想要做的一个玩具示例:

things = [
   Thing 1 RED,
   Thing 2 RED LARGE,
   Thing 3 BLUE SMALL,
   Thing 4 SMALL,
   Thing 5 BLUE DOTTED
]
Run Code Online (Sandbox Code Playgroud)

等等

这样做的正确方法是什么?

J. *_*son 7

假设和弦是Notes的集合.

data Note = A | Bb | B | C | ...
Run Code Online (Sandbox Code Playgroud)

但也有可选的注释集

data Ann = Seventh | Sus2 | Split | ...
Run Code Online (Sandbox Code Playgroud)

我们可以将和弦建模为

data Chord = Chord { notes :: [Note]
                   , anns :: [Ann]
                   }
Run Code Online (Sandbox Code Playgroud)

我们可以用这种方式建立一个完整的词汇表

maj :: Note -> Chord
ann :: Ann -> Chord -> Chord
transpose :: Int -> Note -> Note
transposeChord :: Int -> Chord -> Chord
Run Code Online (Sandbox Code Playgroud)

然后像这样构建我们的列表

chords = [
  ann Seventh (maj C)
, ann Split (ann Sus2 (maj A))
]
Run Code Online (Sandbox Code Playgroud)