gpt4 book ai didi

haskell - 我可以创建一个类似于 Int 的 'Looks' 仿函数数据类型吗?

转载 作者:行者123 更新时间:2023-12-02 10:01:24 26 4
gpt4 key购买 nike

我不确定我在这里是否过于雄心勃勃,但我正在尝试构造一个整数 mod 12 数据类型以在音乐符号系统中使用。如果可能的话,我希望在实践中只需使用数字 0-11 即可指定这种类型的值(例如,而不是编写“Note 11”),并通过该类型的类型签名来推断 Note 类型使用它的函数。我使用它创建了一个笨重的临时版本

type Note = Int

然后简单地用 mod 12 函数组合作用于 Notes 的任何函数。这工作得很好,但它是重复的。它看起来像是仿函数的完美位置,使用的东西大致类似于

instance Functor Note where
fmap f = (`mod` 12).f

我认为,如果我在使用该数据类型时编写“Note 0”或类似的内容,我可以轻松地完成这项工作,但这与我当前正在做的输入量完全相同(尽管不可否认,这可能是稍微不太容易出错)。最后,我知道智能构造函数是与我正在研究的内容密切相关的主题,但到目前为止,我还无法设法使它适用于我的白日梦设置。有什么办法可以让我在这里吃掉我的蛋糕(用普通整数 0-11 表示 Notes)(为 Notes 定义 fmap),还是我很乐观?

提前致谢!

最佳答案

您要查找的类是Num:Haskell 中的文字语法0 隐式调用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)

对于其他Num 操作依此类推。您可能还想使用 Hackage 包 modular-arithmetic ,它提供了 Mod Int 12 类型并且已经提供了这些操作。

关于haskell - 我可以创建一个类似于 Int 的 'Looks' 仿函数数据类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37401404/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com