は、私は、リストはHaskellのガードに二つの選択肢がある空であるかどうかを確認したいと?私は、プレリュード関数ではなくより基本的な構文に頼っているので、空リストテストを言う傾向がありますが、私は確信していません。ハスケルの空リストをチェックする:(長さリスト== 0)または(リスト== [])がより効率的ですか?より効率的にこれらの二つの論理テストの</p> <ol> <li><code>length list == 0</code></li> <li><code>list == []</code></li> </ol> <p>:
答えて
length list == 0
は、長さを得るためにリスト全体を走査する必要があります。つまり、O(n)です。 list == []
は、要素タイプにEq
という制約をもたらします。 null list
は一定の時間で実行され、typeclassの制約はありません。
しかし、それは長いリストを経由せずlength list1 == length list2
にうまく一般化という利点がありlength list == 0
ような何かをするために巧妙なトリックがある:比較のみをするように、あなたは自然数の十分怠惰な表現とgenericLength
を使用することができますリストのうち短いほうを横切るような力。
一例はthe Natural
typeを使用することです:
import Data.Number.Natural
import Data.List (genericLength)
nats :: [Int]
nats = iterate succ 0
areThereTenNats :: Bool
areThereTenNats = genericLength nats >= (10 :: Natural)
「自然数の十分に怠惰な表現」は、非効率的で、ばかげて非効率的であることの間で変化します。また、OPの問題に対する他の解決策は、少なくとも「ヌル」と同じことをしなければならないことです。 –
@DerekElkins、第1引数でのパターンマッチングによる追加と、第2引数での「パラメトリック」による従来の実装は、うまく動作します。それでも、 'genericLength'ソースコードと' + '実装ソースコードを読む必要があります。パラメトリックを使って 'forall a。 'を見るのはもっと明らかです。 [a] 'は自然数である。 – dfeuer
@dfeuer "== 0"の場合はもっと明確にすべきだったと思いますが、 "null"より速くないのは過度に非効率的ではありません。それ以外の場合は、2つのポインタを並行して割り振りを必要とせずに無駄な計算をするためのレシピです。それはポインタの歩行と同じ漸近効率を持っています。あなたが効率を心配している場合、「怠惰な自然」型に切り替えることは、あなたがやるべきこととまったく逆のことであることを示したかっただけです。 (私はCactusがそう言っていると言っているわけではありません) –
他の人が示されているとおり、リストが空(およびより何)であるかどうかを確認するための最良の方法はどのできる
null :: Foldable f => f a -> Bool
を使用することですタイプで使用する
null :: [a] -> Bool
あなたが弱いのでリストが空であるかどうかチェックしたい場合
f [] = something
f (x : xs) = something using x and/or xs
あなたは二つのリスト(およびこれ以上)の長さを比較したい場合は、最良の方法は、通常
のようなものである:そう、あなたは一般的に代わりにパターンマッチングを使用する必要があり、その要素を見てトンcompareLength :: [a] -> [b] -> Ordering
compareLength [] [] = EQ
compareLength [] (_ : _) = LT
compareLength (_ : _) [] = GT
compareLength (_ : xs) (_ : ys) =
compareLength xs ys
リストの長さが一定数と比較する方法をチェックするための最良の方法は、あなたのリストが空の場合は、に一定の時間で確認することができます
compareToLength :: Foldable f
=> f a -> Int -> Ordering
compareToLength = foldr go (compare 0) where
go _ r n | n <= 0 = GT
| otherwise = r $! n - 1
ですはブール値を返します。
はい、この回答は[dfeuer's](https://stackoverflow.com/a/36481943/745903)に何を追加していますか? – leftaroundabout
- 1. リスト<XElement>をList <XElement.Value>
- 2. リスト< >辞書の中に< K,List< >>(C#)
- 3. リストを<MyObject>をDictionary <obj.string、List <obj.ID>>
- 4. MySQLでは、より効率的です:IFNULLまたはNULLIF?</p> <pre><code>IFNULL(column_name, 'test') = 'test' </code></pre> <p>または</p> <pre><code>NULLIF(column_name, 'test') IS NULL </code></pre> <p>、より効率的である1:
- 5. List <Map <String、String >> vsリスト<Object>
- 6. List <SomeParamType>からList <SomeParamType><?>>
- 7. リスト(<%の#、<%=、など...)
- 8. リスト<Class>をC#のDictionary <string、List <String>>に変換する方法はありますか?
- 9. 割り当てのArrayList <リスト<Integer>><ArrayListの<Integer>>
- 10. List <Point2D.Double>をリストに変換する<Point>
- 11. チェックリスト文字列は、私は何もない空間(「<em>_</em> _」)</p> <pre><code>List<string> MyList = (List<string>)Session["MyList "]; if(MyList !=null || MyList != "") { } </code></pre> <p>マイリストのリストを持っている
- 12. リスト<? Base> VS Listを拡張します<Base>
- 13. リスト<T>はどのように辞書<K, List<T>で動作しますか?
- 14. ハスケル/フレーゲ<= <や= <<連想
- 15. List <SomeClass <SomeClassの子> SomeClassの子孫>をリストに追加<SomeClass<?>>
- 16. List <Map <String、List <>>> BaseAdapter、Android
- 17. Visual studio 2005:List <T> .First()リストC#の<T> .Last()メソッド?
- 18. リストの取得<Object>マップからのすべてのキーについて<String、List <Object>>(Java)
- 19. List <>
- 20. リスト<Class>()(0)
- 21. Heredoc <<<または<<?
- 22. どのように私は <pre><code>list = [['vegas','London'],['US','UK']] </code></pre> <p></p>がどのようにこのリストの各要素にアクセスするためのリストを持っているリスト要素
- 23. は、私は、文字列中で</li> </ol> <p>を2つのリスト</p> <ol> <li>ネストされた文字列のリスト、および</li> <li>リストを持っている「system.collections.generic.list文字列」
- 24. リストのテスト<T>リストを使用する<T>
- 25. リスト<?>対リスト<?オブジェクト>
- 26. は私が</p> <pre><code>List[(String, Object)] </code></pre> <p>どのように私はこのリストをループ<code>for</code>を使用することができ、以下のようなサンプル<code>List</code>を持ってScalaの
- 27. List <Tuple <DateTime、string >>
- 28. リスト<object1>とリスト<object2>
- 29. は効率的Iを効率的<strong>に必要</strong><code>n</code> 選択肢から長<code>k</code>次の順列を計算するn個の選択肢から
- 30. 変換リスト<Object><attributeA、リスト<attributeB>
1はリストの長さが線形(明らかに)で、2は一定時間です。しかし、2は本当に必要でないときに 'Eq'制約が必要なという落とし穴があります。ヌルの空リストをチェックするか、単純にパターンマッチングでチェックしてください。 – user2407038
他の定義済みのリストと同等かどうかを比較したいときは、パターンマッチングは機能しません –
また感謝します。あなたはヌルについて詳しく説明できますか? –