私は興味を持ってHaskellを学び始めたところです。私はフォローします learnyouahaskell.com 。
そこで私はこれを見つけました:
null
はリストが空かどうかをチェックします。そうである場合はTrue
を返し、そうでない場合はFalse
を返します。xs == []
の代わりにこの関数を使用してください(xs
というリストがある場合)
何故ですか?両方が同じ結果を生成するのに、なぜ==
の代わりにnull
を使用する必要があるのですか?
ありがとう。
リストを==
と比較するには、要素が比較可能である必要があります(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).
私の意見では、null myList
はmyList == []
よりも自然に読みます。
しかし、raisond'être for null
は、関数として使用できるということです。たとえば、リストのリストを取得し、空でないリストのみを返す関数を次に示します。
nonemptyLists :: [[a]] -> [[a]]
nonemptyLists = filter (not . null)
null
がないと、これはもっと厄介です。
nonEmptyLists = filter ([] /=)
null
を使用するもう1つの利点は、他の多くのコンテナー(Data.Sequence、Data.ByteStringなど)にもnull
関数があることです。これにより、インポートステートメントを変更するだけで別の実装に簡単に切り替えることができます。