音楽プロジェクトで小さな美的問題に遭遇し、しばらくの間悩まされてきました。
タイプがdata Key = C | D | ...ありScale、a Keyとa からを構築できModeます。Mode例えば、Aメジャーとマイナースケールを区別します。
Modeタイプを関数Keyto からとして定義できますScale。その場合、モードには小文字の名前が付き(これで問題ありません)、次のようなスケールを取得できます。
aScale = major C
しかし、ミュージシャンはこのように話しません。彼らはこのスケールをメジャーCスケールではなく、Cメジャースケールと呼びます。
私が欲しいもの
理想的には書きたい
aScale = C major
これはまったく可能ですか?
私が試したもの
からa Keyを作成する関数を作成できるので、ScaleMode
aScale = c Major
しかし、キーをスケールの構築に限定することはできません。それらは他のものにも必要です(例えば、コードの構築)。またKey、のインスタンスである必要がありますShow。
追加の関数(または値コンストラクター)を使用する場合、Modeその後に置くことができKeyます。
aScale = scale C major と scale :: Key -> Mode -> Scale
しかし、余分な単語スケールは、その名前に反して騒々しく見え、scale実際にはスケールとは関係ありません。インテリジェントな部分はにありmajor、scale本当にただflip ($)です。
よりインテリジェントである必要があることnewtype Mode = Major | Minor ...を除いて、aを使用してもそれほど大きな変化はありませんscale。
aScale = scale C Major
major C。