haskell - 嵌套的空列表

eps*_*lbe 7 haskell nested-lists

您好Haskellers和Haskellettes,

在阅读http://learnyouahaskell.com/时,我的一位朋友提出了一个问题:

在Haskell中是否可以编写递归函数,如果所有子子列表都为空,则该函数给出True.我的第一个猜测是 - 应该是 - 但我只是编写类型注释有一个大问题.

他尝试了类似的东西

nullRec l = if null l
               then True
               else if [] `elem` l
                    then nullRec (head [l]) && nullRec (tail l)
                    else False
Run Code Online (Sandbox Code Playgroud)

这是 - 不工作 - :-)

我想出了类似的东西

  • 用concat折叠 - 得到一个单一的长列表
    (给我实现问题)
  • 或制作无限的树状数据类型 - 并从列表中进行此操作
    (尚未实现)

但后者对于这个问题听起来有点过分.你有什么想法 - 在这样一个阳光明媚的星期天;-)

提前致谢


作为对所有评论的反应 - 这是糟糕的风格,我想补充一下这只是一个实验!
不要在家尝试做这个!;-)

fuz*_*fuz 5

类型类怎么样?

{-# LANGUAGE FlexibleInstances, OverlappingInstances #-}

class NullRec a where
  nullRec :: a -> Bool

instance NullRec a => NullRec [a] where
  nullRec [] = True
  nullRec ls = all nullRec ls

instance NullRec a where
  nullRec _  = False

main = print . nullRec $ ([[[[()]]]] :: [[[[()]]]])
Run Code Online (Sandbox Code Playgroud)

  • 更准确地说,您不仅使用类型类而且还使用GHC扩展[OverlappingInstances](http://www.haskell.org/ghc/docs/7.0.4/html/users_guide/type-class-extensions.html#例如重叠).如果没有此扩展,即使使用类型类也无法实现问题所需.这有力地表明,如果有人__实现这个(除了作为实验),该程序可能没有以正确的方式设计. (5认同)