我在音乐项目中遇到了一个美学上的小问题,并且困扰了我一段时间。
我有一个类型data Key = C | D | ...,可以Scale从Key和构造一个Mode。该Mode例如主要的和次要的规模进行了区分。
我可以将Mode类型定义为从Keyto 的函数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。