在我的初学者看来,人们可以实现Data.List.null:
null [] = True
null _ = False
Run Code Online (Sandbox Code Playgroud)
查看Hackage中的实际来源,我看到:
null = foldr (\_ _ -> False) True
Run Code Online (Sandbox Code Playgroud)
我发现这很好奇,当然我错过了一些我应该学习的东西,但是什么呢?
dup*_*ode 15
null是一个Foldable类的方法:
GHCi> :t null
null :: Foldable t => t a -> Bool
Run Code Online (Sandbox Code Playgroud)
您引用的实现是默认实现,Foldable即使它们没有定义特定的实现,也适用于所有实例:
class Foldable t where
-- etc.
null :: t a -> Bool
null = foldr (\_ _ -> False) True
-- etc.
Run Code Online (Sandbox Code Playgroud)
该列表实例,但是,覆盖默认的实现:
instance Foldable [] where
-- etc.
null = List.null
-- etc.
Run Code Online (Sandbox Code Playgroud)
List.null反过来,以您期望的更简单的方式定义GHC.List:
null :: [a] -> Bool
null [] = True
null (_:_) = False
Run Code Online (Sandbox Code Playgroud)