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)
等等
这样做的正确方法是什么?
假设和弦是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)