web-dev-qa-db-ja.com

==の代わりにnull

私は興味を持ってHaskellを学び始めたところです。私はフォローします learnyouahaskell.com

そこで私はこれを見つけました:

nullはリストが空かどうかをチェックします。そうである場合はTrueを返し、そうでない場合はFalseを返します。 xs == []の代わりにこの関数を使用してください(xsというリストがある場合)

何故ですか?両方が同じ結果を生成するのに、なぜ==の代わりにnullを使用する必要があるのですか?

ありがとう。

34
bdhar

リストを==と比較するには、要素が比較可能である必要があります(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).
69
sdcvvc

私の意見では、null myListmyList == []よりも自然に読みます。

しかし、raisond'être for nullは、関数として使用できるということです。たとえば、リストのリストを取得し、空でないリストのみを返す関数を次に示します。

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

nullがないと、これはもっと厄介です。

nonEmptyLists = filter ([] /=)
11
Thomas

nullを使用するもう1つの利点は、他の多くのコンテナー(Data.Sequence、Data.ByteStringなど)にもnull関数があることです。これにより、インポートステートメントを変更するだけで別の実装に簡単に切り替えることができます。

6
John L