我不确定我是否过于雄心勃勃,但我正在尝试构建一个整数mod 12数据类型,用于音乐符号系统.如果可能的话,我希望在实践中可以简单地使用数字0-11来指定这种类型的值(例如,与编写"注11"相反),并且可以通过类型签名来推断Note类型.使用它的函数.我用它创造了一个笨重的临时版本
type Note = Int
Run Code Online (Sandbox Code Playgroud)
然后简单地用mod 12函数组合任何作用于Notes的函数.这非常有效,但它是重复的.对于仿函数来说,它看起来是一个完美的选择,使用大致相似的东西
instance Functor Note where
fmap f = (`mod` 12).f
Run Code Online (Sandbox Code Playgroud)
我想如果我在使用数据类型时随时写下"Note 0"或其他内容,我就可以轻松地完成这项工作,但这与我目前所做的完全相同的输入量(尽管可能它的误差可能略微减少)易于).最后我知道智能构造函数与我正在研究的内容是一个密切相关的主题,但到目前为止,我无法设法为我的管道梦想设置.有没有什么方法可以让我的蛋糕(用简单的整数0-11代表注释)和吃它(在这里定义fmap),或者我是否乐观?
提前致谢!
您正在寻找的类是Num:0Haskell中的文字语法隐式调用fromInteger.所以你可能会写类似的东西
newtype Note = Note Int
instance Num Note where
fromInteger n = Note (fromInteger (n `mod` 12))
Note a + Note b = Note ((a + b) `mod` 12)
Run Code Online (Sandbox Code Playgroud)
等等其他Num操作.您可能还想使用Hackage包模块算法,它提供了Mod Int 12类型并且已经可以使用这些操作.