【问题标题】:I think there is a type mismatch in default definition in instance Applicative Maybe in Haskell我认为 Haskell 中的 Applicative Maybe 实例中的默认定义存在类型不匹配
【发布时间】:2018-08-13 03:59:59
【问题描述】:

我目前正在与 Hutton 教授的“Haskell 编程”一起学习 Haskell,我发现将 Maybe 定义为 Applicative 类的实例有些奇怪。

GHC.Base中,实例Applicative Maybe定义如下:

instance Applicative Maybe where
  pure = Just

  Just f  <*> m       = fmap f m
  Nothing <*> _m      = Nothing

困扰我的是将Nothing &lt;\*&gt; _ 的值定义为Nothing 的行。 Nothing 属于 Maybe a 类型,其中运算符 &lt;*&gt; 实际上需要 f (a -&gt; b)(在本例中为 Maybe (a -&gt; b))作为其第一个参数的类型。因此,这是 Haskell 应该抱怨的类型不匹配。但是,这被接受为默认定义,因此 Haskell 不会在我认为应该抱怨的地方抱怨它。

我错过了什么?

【问题讨论】:

    标签: haskell types applicative


    【解决方案1】:

    Maybe a 中的a 是一个类型变量,可以是任何类型!例如,Nothing 可以具有 Maybe IntMaybe [x]Maybe (p -&gt; q) 类型。 不要对变量名称a 用于两个地方这一事实感到困惑。 Nothing 类型中的a&lt;*&gt; 类型中的a 是完全不同的变量,并且恰好同名!

    (这与你写f x = x + 5然后在其他地方写g x = "Hello, " ++ x完全一样。在这两个地方使用x并不重要,因为它们在不同的范围内。与a相同在这种类型中。不同的作用域,所以它们是不同的变量。)

    【讨论】:

    • 哦,我明白了!因此,“Maybe a”中的“a”是可以赋予​​构造函数“Maybe”的任何类型的非常广泛的概括。非常感谢!
    【解决方案2】:

    让我们通过重新标记类型变量来使事情更清楚:

    Nothing :: Maybe x
    

    Maybe x 类型与Maybe (a -&gt; b) 统一,与x ~ (a -&gt; b) 统一。也就是说,Nothing 是一个可以用作 any aMaybe a 的值,包括函数类型。因此,这里是&lt;*&gt; 的合法左手参数。

    【讨论】:

    • 感谢您的回答。这里的小后续问题:我应该将 x ~ (a -> b) 读为“变量 x 与类型 (a -> b) 相关联”吗?
    • @Namudon'tdie:x ~ ytype equality constraint。非正式地,人们用它来表示“x 类型等于y 类型”;在 Haskell 中,当启用某些扩展(例如 GADTsTypeFamilies)时,您可以将此语法用作类型类约束。它主要用于控制类型类实例解析和辅助类型级编程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多