2015-09-08 35 views
4

Maybe列表的Hackage文檔可以作爲Maybe的一個typeclasses摺疊。它還列出了以下功能:爲什麼我不能在Haskell中執行`null(Just 5)`?

null :: Maybe a -> Bool 

它甚至還列出了這一功能的實現(從Foldable):

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

...這似乎是相當合理的。它也適用:如果我import qualified Data.Foldable,我可以在Maybe值上使用foldr

然而,當我嘗試調用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任何摺疊。

+5

什麼GHC /基礎版本您使用的?因爲是與基礎4.8.x是['TA - > Bool'](https://hackage.haskell.org/package/base-4.8.1.0/docs/Prelude.html#v:null),但['空'曾經是'[A] - > Bool'](https://hackage.haskell.org/package/base-4.7.0.1/docs/Prelude.html#v:null) – Carsten

+0

@Carsten是的,這正是它 - Ubuntu Vivid顯然仍在發佈[ghc 7.6.3](http://packages.ubuntu.com/vivid/ghc),該版本於2013年4月發佈,並具有較舊版本的基礎。 –

+1

噢,抱歉 - 看到你的答案下旬 - 順便說一句,你可以使用[赫伯特·V. Riedels PPA來源(https://launchpad.net/~hvr/+archive/ubuntu/ghc):d – Carsten

回答

8

事實證明,我是跑GHC(默認版本爲我的OS)的舊版本,而文件是爲最新的版本(當然)。

在GHC 7.10.2至少,你得到了序幕null支持Foldables(如可能),而不必輸入任何東西:

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

這是由於[燃燒橋樑建議](https://wiki.haskell.org/Foldable_Traversable_In_Prelude)。以防萬一你想知道爲什麼'Foldable'獲得了很多額外的功能,'Prelude'的類型在7.8到7.10之間變化很大。 – Zeta

3

有所謂null多種功能。你在ghci中獲得的是Prelude,它是null :: [a] -> Bool。發生這種情況的原因是隱含地導入了從Prelude導出的所有內容。

要得到正確的一個,您需要import Data.Foldable (Foldable(null)) *,併爲了防止出現歧義,您需要輸入import Prelude hiding (null)。以這種方式顯式重新導入Prelude可防止以其他方式發生的隱式導入。

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

+0

感謝 - 但是,沒有按似乎沒有工作 - 我得到'Module'Data.Foldable'不導出'空' –

+0

@WanderNauta我的錯誤。固定。 – Dan

+0

事實證明,更新GHC足以解決問題 - 但再次感謝! –

相關問題