音楽プロジェクトで小さな美的問題に遭遇し、しばらくの間悩まされてきました。
タイプがdata Key = C | D | ...
ありScale
、a Key
とa からを構築できMode
ます。Mode
例えば、Aメジャーとマイナースケールを区別します。
Mode
タイプを関数Key
to からとして定義できますScale
。その場合、モードには小文字の名前が付き(これで問題ありません)、次のようなスケールを取得できます。
aScale = major C
しかし、ミュージシャンはこのように話しません。彼らはこのスケールをメジャーCスケールではなく、Cメジャースケールと呼びます。
私が欲しいもの
理想的には書きたい
aScale = C major
これはまったく可能ですか?
私が試したもの
からa Key
を作成する関数を作成できるので、Scale
Mode
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
。