gpt4 book ai didi

haskell - 你可以在haskell中重载+吗?

转载 作者:行者123 更新时间:2023-12-03 06:11:45 25 4
gpt4 key购买 nike

虽然我在 Haskell 示例代码中看到了各种奇怪的东西 - 我从未见过运算符 plus 被重载。有什么特别的吗?

假设我有一个类似 Pair 的类型,并且我想要类似

 Pair(2,4) + Pair(1,2) = Pair(3,6)

可以用 Haskell 来做吗?

我只是很好奇,因为我知道在 Scala 中可以以一种相当优雅的方式实现这一点。

最佳答案

(+)Num 类型类的一部分,每个人似乎都觉得你不能为你的代码定义 (*) 等类型,但我强烈不同意。

newtype Pair a b = Pair (a,b)  deriving (Eq,Show) 

我认为配对b会更好,或者我们甚至可以直接使用类型(a,b),但是...

这非常像数学中两个幺半群、群、环或其他任何东西的笛卡尔积,并且有一种定义数字结构的标准方法,使用起来很明智。

instance (Num a,Num b) => Num (Pair a b) where
Pair (a,b) + Pair (c,d) = Pair (a+c,b+d)
Pair (a,b) * Pair (c,d) = Pair (a*c,b*d)
Pair (a,b) - Pair (c,d) = Pair (a-c,b-d)
abs (Pair (a,b)) = Pair (abs a, abs b)
signum (Pair (a,b)) = Pair (signum a, signum b)
fromInteger i = Pair (fromInteger i, fromInteger i)

现在我们已经以明显的方式重载了 (+),但也彻底重载了 (*) 和所有其他 Num 的函数与数学对成对函数的函数相同、明显、熟悉。我只是不认为这有什么问题。事实上,我认为这是一个很好的做法。

*Main> Pair (3,4.0) + Pair (7, 10.5)
Pair (10,14.5)
*Main> Pair (3,4.0) + 1 -- *
Pair (4,5.0)

* - 请注意,fromInteger 应用于像 1 这样的数字文字,因此在该上下文中这被解释为 Pair ( 1,1.0)::配对整数 double 。这也非常好用且方便。

关于haskell - 你可以在haskell中重载+吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8308015/

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