代码之家  ›  专栏  ›  技术社区  ›  dopatraman

Haskell如何在实例声明期间推断类型?

  •  1
  • dopatraman  · 技术社区  · 7 年前

    我有以下数据类型和实例声明:

    class Expr a where
      lit :: Integer -> a
    
    data Mod7 = Mod7 Integer deriving (Eq, Show)
    
    instance Expr Mod7 where
      lit x = Mod7 (x `mod` 7)
    

    lit x = Mod7 (x `mod` 7)
    

    由此推断 x mod . 如果没有明确的声明,这种推断怎么可能发生?

    mod的定义是

    mod :: Integral a => a -> a -> a
    

    鉴于上述声明,完全有可能 lit 会通过一个 Integral 未声明函数的类型。GHC如何知道分配给哪种类型

    1 回复  |  直到 7 年前
        1
  •  8
  •   Ben    7 年前

    实例声明中的类型推断与任何其他上下文中的工作方式相同。在这种情况下,有两种推理可以证明 x Integer .

    1. 出现在表达式中 Mod7 (x `mod` 7) . 自从 Mod7 构造函数声明为 整数 x `mod` 7 必须是一个 . 自 mod 属于类型 Integral a => a -> a -> a ,如果 x​​`mod`7 整数 ,然后是两者 7 也必须是 整数 (仅在以下情况下有效) Integral Integer 保持,但它是这样的(没关系)。

    2. lit Expr a => Integer -> a (在 Expr a 点燃 ,所以它必须是 .

    instance Expr Mod7 定义为 lit :: Integer -> Mod7 . 然而,这甚至不需要建立 x :: Integer ,因为参数类型 点燃 在任何情况下都是一样的 Expr ).

    推荐文章