4

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

null :: Maybe a -> Bool

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

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

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

但是,当我尝试调用nullMaybe 时,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,我只是想知道如何调用null任何可折叠的函数。

4

2 回答 2

8

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

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

GHCi, version 7.10.2: http://www.haskell.org/ghc/  :? for help
Prelude> :t null
null :: Foldable t => t a -> Bool
于 2015-09-08T11:52:58.043 回答
3

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

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

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

于 2015-09-08T11:39:21.663 回答