代码之家  ›  专栏  ›  技术社区  ›  bdhar

空而不是==

  •  34
  • bdhar  · 技术社区  · 16 年前

    我只是出于兴趣才开始学习哈斯克尔。我跟随 learnyouahaskell.com .

    在那里我发现了这个:

    null 检查列表是否为空。如果它 是,它回来了 True 否则 收益率 False . 使用此功能 而不是 xs == [] (如果你有 名单被称为 xs )

    为什么会这样?我们为什么要用 无效的 而不是 == 当两者产生相同的结果?

    谢谢。

    3 回复  |  直到 16 年前
        1
  •  68
  •   sdcvvc    16 年前

    将列表与 == 要求元素具有可比性(表示为 Eq a )

    Prelude> :t (==[])
    (==[]) :: (Eq a) => [a] -> Bool
    

    例如, [sin] == [] 不起作用,因为你不能比较函数。它可能看起来很愚蠢,但类型系统必须判断表达式的类型而不查看其值。

    另一张支票是 length xs == 0 ,这不需要相等,但如果列表是无限的,则不会停止(尝试 length [1..] == 0 )这就是为什么有一个专门的功能。

    null [] = True
    null _ = False
    
    Prelude> :t null
    null :: [a] -> Bool     -- Notice lack of (Eq a).
    
        2
  •  11
  •   Thomas    16 年前

    在我看来, null myList 读起来更自然 myList == [] .

    但是 雷森德特 对于 null 它可以用作函数。例如,这里有一个函数,它获取一个列表,只返回非空列表:

    nonemptyLists :: [[a]] -> [[a]]
    nonemptyLists = filter (not . null)
    

    没有 无效的 更尴尬的是:

    nonEmptyLists = filter ([] /=)
    
        3
  •  6
  •   John L    16 年前

    使用的另一个好处 null 许多其他容器(如数据、序列、数据、字节串等)是否具有 无效的 功能也一样。这使得只需更改import语句就可以轻松地切换到另一个实现。