gpt4 book ai didi

c++ - 将具有所有操作的自定义 haskell 类型封装到一个类中

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:19:01 24 4
gpt4 key购买 nike

如果我想在 C++ 中创建一个新类型,我可以在其中重载一堆运算符,我可以这样做:

class Stringy {
public:
explict Stringy(const char *buffer){}
friend Stringy operator + (const Stringy &s1, const Stringy &s2) { ... }
friend Stringy operator - (const Stringy &s1, const Stringy &s2) { ... }
friend std::ostream& operator << (std::ostream &oss, const String& s1) { ... }
};

现在如果我尝试在 Haskell 中做同样的事情,我发现自己在做(一个例子):

data Stringy = Stringy([Char])
-- do something unrelated here --
(+) :: Stringy -> Stringy -> Stringy
(-) :: Stringy -> Stringy -> Stringy
(removeDups) :: Stringy -> Stringy
-- do something else unrelated here --
(>>) :: Stringy -> IO --(is IO right?)

我的观点是,C++ 看起来更像是放在一起的,因为你在该类中所做的一切都以某种方式与该类相关。另一方面,haskell 的运算符声明可能到处都是,不需要在一起。如果有人看一下 c++ 代码,他们可以立即识别哪些操作是类的一部分,哪些不是。我如何在 Haskell 中实现同样的一致性?

我还是 Haskell 的初学者,所以请使用简单的方法。谢谢

最佳答案

正如 Daniel 所说,优秀的库设计者确实会尝试将相关功能放入同一个模块中。因此,通常类型类 Stringy 和所有对 Stringy 的“基本”操作都在模块 Stringy(或 X.Y.Z. Stringy),在文件 Stringy.hs 中。

最终,我想您会欣赏 Haskell 为您提供的灵 active 。例如,假设你想定义一个类型为

的函数
myfunction :: Stringy -> Thingy -> Doohicky

这实际上不适合三个类型类(StringyThingyDoohicky)中的任何一个,因为它引用的类型不是类型类的一部分。也许这三个类型类位于三个不同的模块中,很久以前由不同的人编写。您是第一个意识到 myFunction 将是一个有用操作的人。Haskell 允许你把这个函数放在你认为最有意义的地方。您可能会创建一个全新的模块,专门用于根据其他类型类的值的组合生成 Doohicky

关于c++ - 将具有所有操作的自定义 haskell 类型封装到一个类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29270240/

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