Haskellでリストの最後の要素を取得する最も速い方法は何ですか?また、次の反復では、リストの最初と最後の要素を削除したいと思います。それを行う最もエレガントな方法は何ですか?私はリストの理解をしようとしていますが、それは非常に効率的に見えません!Haskellでリストの最後の要素を取得する最速の方法
答えて
last
とinit
は、1回限りの処理で問題なく動作します。しかし、両方ともO(n)ですので、リストの両端を頻繁に操作する必要がある場合は、Data.Sequence
を代わりに使用することをお勧めします。O(1)挿入と削除両端の品目の
the last
functionを使用すると、リストの最後の要素を取得できます。
最初の要素と最後の要素を削除する方法については、(init . tail)
を使用できますが、それがどれほど効率的かはわかりません。
私はLearn You A Haskellからこのイメージはかなりよく、リスト機能を示し思う:
を削除するには、最初と最後:
take (len(l)-2) (drop 1 l)
またはこれも
init (drop 1 l)
多分
ほぼ最適なコードになります。それはまだ投稿されていないので、私はプレリュードの実装を投稿します:それは通常の前奏曲と競合することなく実行できるように、私はlistLast
に関数名を変更し
listLast :: [a] -> a
listLast [x] = x --base case is when there's just one element remaining
listLast (_:xs) = listLast xs --if there's anything in the head, continue until there's one element left
listLast [] = error "Can't do last of an empty list!"
注意を。もちろん、import Prelude hiding(last)
を行うこともできます。
彼女はこれでhttp://learnyouahaskell.com/chaptersで使うコンベンションには「最後」があります。 – CSharper
(head.reverse) [1..100]
最後の要素を取得するためのlast
の代替品です。
drop 1 (take (length [1..100] - 1) [1..100])
は、最初と最後のリスト要素を削除します。 drop
とtake
のソースは、(init . tail)
より速いかもしれません。
(reverse.drop 1) ((reverse.drop 1) [1..100])
は、別の変形である。しかし、私はダブル反転のために遅くなると思う。
'length'は正当な理由なしにやりたいことはめったにありません。ここには正当な理由はない。逆も同様です。 – dfeuer
この答えは、空のリストのような奇妙な条件を最大限に柔軟に扱い、小さな関数から大きな関数をいくつかのライブラリ関数を使って構築することに重点を置いています。それはではありません。誰かが最初にリストについて学ぶのに最適な答えですが、その前にいくつかのステップがあります。
以下の場合、あなたは
import Control.Monad ((>=>))
が必要になりますし、あなたはGHC 7を使用するのいずれかが必要になります。
init' :: [x] -> Maybe [x]
init' = foldr go Nothing
where
go x mxs = Just (maybe [] (x:) mxs)
tail
のバージョンがそれでは
tail' :: [a] -> Maybe [a]
tail' = fmap snd . uncons
を書き込むことができ
あなたが得ることができる:10とData.List (uncons)
をインポートしたり、
uncons :: [a] -> Maybe (a, [a])
uncons [] = Nothing
uncons (x:xs) = Just (x,xs)
を定義しますが、このようなinit
の安全なフォームを書くことができますa maybefied
trim' :: [a] -> Maybe [a]
trim' = init' >=> tail'
>=>
は、一種の後方モナド構成です。 init' >=> tail'
は、その引数にinit'
を適用してMaybe [a]
を取得する関数です。 Nothing
を取得した場合は、それを返します。 Just xs
を取得した場合はtail'
をxs
に適用し、それを返します。このことから
、あなたは簡単にダウン空のリストに0、1、または2つの要素でリストをトリミングトリマーを行うことができます。私は取得すると思い
trim :: [a] -> [a]
trim = maybe [] id . trim'
- 1. ビューポートで要素を取得する最速の方法
- 2. jspでリストの最初の要素を取得する方法
- 3. Javaでリスト要素の最後の部分を取得する
- 4. graphqlで最後の3要素を取得する方法
- 5. Haskellのリストの最後に要素を追加します。
- 6. リストから最後の要素のみを取得する
- 7. SortedDictionaryの最後の要素を取得
- 8. djangoテンプレートフィルタchaning - 最後の要素の最後の要素を取得
- 9. 私は、リストの最後の要素を取得したい、F#
- 10. 一意のデータをソートして取得する最速の方法 - 最後のオカレンスが必要ですか?
- 11. 配列の最後の要素をスカラで取得する方法
- 12. XPathでシーケンスの最後の要素を取得する方法は?
- 13. 再帰を使ってhaskellのリストの最後の要素を返す
- 14. CoffeeScriptで配列の最後の要素を取得する
- 15. Pythonで範囲の最後の要素を取得する
- 16. R - ベクトルの最大n個の要素のインデックスを取得するための最も速い方法
- 17. リストの最後のインデックスを取得する方法は?
- 18. 配列の最後の要素の値を取得する方法は?
- 19. 最初の要素と最後の要素を除外する方法
- 20. multi_index_containerから最後の2番目の要素を取得する方法
- 21. 配列から最後のn個の要素を取得する方法
- 22. ループ内のリストの最後の要素
- 23. リストの最後から最後の2つの要素を取得できません。C++、mfc
- 24. std :: mapの最初のn要素を取得する方法
- 25. 最初の5つの要素を取得する方法
- 26. 最低カウント数のリストの要素を取得する*
- 27. Grailsリストの最初の要素を取得する
- 28. Jinja2(Flask)のリストから最大要素を得る方法
- 29. Python、最初のリスト要素を逆順に取得する方法は?
- 30. Pythonで行列要素をテストする最速の方法
*最後*の要素が効率的に困難です。おそらく、コンテキストをより詳細に説明する必要があるかもしれないので、ニーズに合った他のデータ構造があるかどうかを知ることができます。 – phimuemue
Prelude.lastが良い実装を持っていることを疑う理由はほとんどありません。 phimuemueが言っているように、より良い質問は、あなたが 'last'をたくさん使っている場合、あなたはリスト以外の何かを必要としないかどうかです。 Data.Sequenceまたはそのようなもの。 – applicative