gpt4 book ai didi

haskell - 类型类实例内的类型类约束

转载 作者:行者123 更新时间:2023-12-02 10:23:13 25 4
gpt4 key购买 nike

您好,在做 Real World Haskell 书中的示例时,我遇到了这个示例,但我无法理解它的含义以及它是如何工作的:
实例 Num a=>Num (SymbolicManip a)
在这种情况下,我应该翻译成这样的内容:“对于SymbolicManip类型的Num实例,有一个关于其a类型字段的约束,即:a 是 Num 本身的实例”?有人可以告诉我我的解释是否正确或解释一下吗?
为什么 instance Num (SymbolicManip a) 就足够了?

-- The "operators" that we're going to support
data Op = Plus | Minus | Mul | Div | Pow
deriving (Eq, Show)

{- The core symbolic manipulation type -}
data SymbolicManip a =
Number a -- Simple number, such as 5
| Arith Op (SymbolicManip a) (SymbolicManip a)
deriving (Eq, Show)

{- SymbolicManip will be an instance of Num. Define how the Num
operations are handled over a SymbolicManip. This will implement things
like (+) for SymbolicManip. -}
instance Num a => Num (SymbolicManip a) where
a + b = Arith Plus a b
a - b = Arith Minus a b
a * b = Arith Mul a b
negate a = Arith Mul (Number (-1)) a
abs a = error "abs is unimplemented"
signum _ = error "signum is unimplemented"
fromInteger i = Number (fromInteger i)

P.S所有代码均来自本书(第 13 章 - 子章-扩展示例-数字类型)

最佳答案

重要的是要看到 SymbolicManip a 不能是 Num 的实例,除非 a 也是 Num< 的实例 因此,就像我们向函数添加约束一样,我们可以向类型类添加约束:

 instance Num a => Num (SymbolicManip a) where
-- ^^^^^^^^ "As long as `a` is an instance of `Num`..."
-- ^^^^^^^^^^^^^^^^^^^^^ "...so is `SymbolicManip a`"

我们必须包含Num a =>约束,因为在实现中,我们使用fromInteger来生成类型的成员>一个。这是不可避免的,就像给函数example a b = 2*a + b添加一个Num约束一样,即example::Num a => a -> a -> a.

这是一个更简单的示例。考虑这种类型:

newtype Identity a = Identity a

请注意,Identity a 可以是 Num 的实例,只要 aNum同样,所以我们添加一个约束:

instance Num a => Num (Identity a) where
-- (...)

关于haskell - 类型类实例内的类型类约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51260266/

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