为什么'Data.List.null'使用'foldr'?

时间:2016-12-05 16:33:52

标签: haskell

在初学者看来,可以将Data.List.null实现为:

null [] = True
null _ = False

查看Hackage中的实际来源,我看到:

null = foldr (\_ _ -> False) True

我觉得这很奇怪,我肯定错过了一些我应该学习的东西,但是什么呢?

1 个答案:

答案 0 :(得分:15)

Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, ContactsContract.Contacts.HAS_PHONE_NUMBER + " = 1", null, "UPPER(" + ContactsContract.Contacts.DISPLAY_NAME + ") ASC"); Foldable类的一种方法:

null

您引用的实现是the default one,即使它们没有定义特定的实现,也适用于GHCi> :t null null :: Foldable t => t a -> Bool 的所有实例:

Foldable

list instance会覆盖默认实现:

class Foldable t where
    -- etc.
    null :: t a -> Bool
    null = foldr (\_ _ -> False) True
    -- etc.

instance Foldable [] where -- etc. null = List.null -- etc. 反过来,is defined in GHC.List以您期望的更简单的方式:

List.null