代码之家  ›  专栏  ›  技术社区  ›  Bercovici Adrian

typeclass实例内的typeclass约束

  •  2
  • Bercovici Adrian  · 技术社区  · 6 年前

    你好,在做来自现实世界哈斯克尔书的例子时,我遇到了这个例子,我无法理解它的含义和工作原理:
    instance Num a=>Num (SymbolicManip a)
    在这种情况下,我应该将其转换为类似这样的内容:“例如num instance of type SymbolicManip 对于其类型的字段有一个约束 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)
    

    附笔 所有代码都是从书上写的( 13 分章 -扩展示例数值类型)

    2 回复  |  直到 6 年前
        1
  •  5
  •   AJF    6 年前

    SymbolicManip a Num a

     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 example :: Num a => a -> a -> a

    newtype Identity a = Identity a
    

    Identity a

    instance Num a => Num (Identity a) where
    -- (...)
    
        2
  •  3
  •   Paul Johnson    6 年前

    a Num SybolicManip a

    x :: SymbolicManip Integer
    y :: SymbolicManip Integer
    

    x+y SymbolicManip String String

    negate fromInteger