我在音乐项目中遇到了一个美学上的小问题,并且困扰了我一段时间。
我有一个类型data Key = C | D | ...
,可以Scale
从Key
和构造一个Mode
。该Mode
例如主要的和次要的规模进行了区分。
我可以将Mode
类型定义为从Key
to 的函数Scale
。在这种情况下,模式将使用小写名称(可以),我可以得到一个这样的Scale
aScale = major C
但是音乐家不会这样说话。他们将此比例称为C大尺度,而不是C大尺度。
我想要的是
理想情况下,我想写
aScale = C major
这有可能吗?
我尝试了什么
我可以创建Key
一个Scale
从构造a的函数Mode
,所以我可以写
aScale = c Major
但是我不能将关键限制在构建音阶上。其他事物也需要它们(例如,构建和弦)。也Key
应该是的实例Show
。
当我使用额外的函数(或值构造函数)时,可以放在Mode
后面Key
:
aScale = scale C major
与 scale :: Key -> Mode -> Scale
但是额外的单词标度看起来很吵,并且与名称相反,它scale
实际上与标度无关。聪明的地方在于major
,scale
确实是公正flip ($)
。
使用a newtype Mode = Major | Minor ...
并不会带来太大变化,只是scale
需要更加智能:
aScale = scale C Major
major C
。