代码之家  ›  专栏  ›  技术社区  ›  J Cooper

Haskell如何知道您所指的类型类实例?

  •  4
  • J Cooper  · 技术社区  · 15 年前

    这个问题是在阅读《优秀学习你的应用功能》中的新章节时产生的。

    作为maybe实例定义的一部分,applicative typeclass具有:

    pure = Just
    

    如果我只是去GHCI和进口管制局,申请,然后做:

    pure (3+)
    

    我什么都得不到(说得通)。但如果我在表达中使用它:

    pure (3+) <*> Just 4
    

    我只有7分。我想这也不足为奇,但我遗漏了一些关于typeclass如何工作的完整信息,我认为,调用 pure 在这里。

    如果我的困惑是有道理的,有人能详细解释一下发生了什么吗?

    4 回复  |  直到 15 年前
        1
  •  7
  •   newacct    15 年前

    这只是类型推理。这个 (<*>) 运算符要求两个参数使用相同的 Applicative 实例。右边是一个 Maybe 所以左边必须是 也许吧 也。这就是它如何计算出这里使用的实例。您可以通过键入来查看解释器中任何表达式的类型。 :t expression 如果您只浏览每个子表达式并查看推断出的类型,可能会更好地了解正在发生的事情。

        2
  •  3
  •   Norman Ramsey    15 年前

    值得一看编译器推断的类型 pure (3+) :

    Prelude Control.Applicative> :t pure (3+)
    pure (3+) :: (Num a, Applicative f) => f (a -> a)
    

    这个术语的类型是重载的,关于numeric类和applicative类的决定被延迟到后面。但可以使用注释强制特定类型,例如:

    *Showfun Control.Applicative> pure (3+) :: Maybe (Double -> Double)
    Just <function>
    

    (这是因为 Showfun 具有将函数值打印为 <function> )

    这只是一个问题,即编译器何时积累了足够的信息来做出决定。

        3
  •  2
  •   bdonlan    15 年前

    为了对newacct的答案进行一点扩展,如果没有足够的信息来推断实际类型,编译器可能(在某些情况下)尝试选择一个默认类型,仅限于那些满足所讨论的类型约束的类型。在这种情况下,对于一些难以确定的num=>n实例,推断的类型为io(n->n)。ghci随后对其进行评估并丢弃返回值,但没有明显的效果。

        4
  •  1
  •   Community Quentin    7 年前

    这里有一个有趣的 SO thread on type inference . 不是特定于haskell,但是有很多关于函数语言中的类型推断的好链接和内容需要阅读。