【问题标题】:Why can't I do `null (Just 5)` in Haskell?为什么我不能在 Haskell 中执行 `null (Just 5)`?
【发布时间】:2015-09-08 11:35:12
【问题描述】:

Maybe 的 Hackage 文档将 Foldable 列为 Maybe 的类型类之一。它还列出了以下函数:

null :: Maybe a -> Bool

它甚至链接到这个函数的实现(来自Foldable):

null :: t a -> Bool
null = foldr (\_ _ -> False) True

...这似乎很合理。它也有效:如果我 import qualified Data.Foldable,我可以在 Maybe 值上使用 foldr

但是,当我尝试在 Maybe 上调用 null 时,Haskell 认为我想使用为列表设计的 null:

Prelude> :t null
null :: [a] -> Bool
Prelude> null Nothing
<interactive>:3:6:
    Couldn't match expected type `[a0]' with actual type `Maybe a1'
    In the first argument of `null', namely `Nothing'
    In the expression: null Nothing
    In an equation for `it': it = null Nothing

我知道有 isJust,我只是想知道如何为任何 Foldable 调用像 null 这样的函数。

【问题讨论】:

标签: haskell ghc typeclass maybe foldable


【解决方案1】:

事实证明,我运行的是旧版本的 GHC(我的操作系统的默认版本),而文档是最新版本的(当然)。

至少在 GHC 7.10.2 中,您从 Prelude 中获得的 null 支持 Foldables(如 Maybe),而无需导入任何内容:

GHCi, version 7.10.2: http://www.haskell.org/ghc/  :? for help
Prelude> :t null
null :: Foldable t => t a -> Bool

【讨论】:

  • 这是由于burning bridges proposal。以防您想知道为什么 Foldable 获得了如此多的附加功能,而 Prelude 的类型在 7.8 和 7.10 之间发生了如此大的变化。
【解决方案2】:

有多个函数称为null。你在 ghci 中得到的那个来自Prelude,它是null :: [a] -&gt; Bool。发生这种情况的原因是 Prelude 中的所有内容都是隐式导入的。

要找到正确的,您需要import Data.Foldable (Foldable(null))*,为了防止与错误的混淆,您需要import Prelude hiding (null)。像这样显式地重新导入 Prelude 可以防止隐式导入,否则会发生。

*或import Data.Foldable (Foldable(..)) 获取Foldable 的所有方法。

【讨论】:

  • 谢谢 - 但这似乎不起作用 - 我收到 Module 'Data.Foldable' does not export 'null'
  • @WanderNauta 我的错。固定。
  • 事实证明更新 GHC 足以解决问题 - 不过再次感谢!
猜你喜欢
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-15
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多