0

次のようなリストが与えられた場合:

let list = [1,2,3,4,5,6,7,8,9,10]

7,8,9リストに存在するかどうかを順番に検出し、存在する場合は単に「成功」​​を出力し、そうでない場合は「失敗」する方法を考え出そうとしています。

zipインデックスを使用してこれを達成しようとしています。私が正しい軌道に乗っているかどうか、またはこれを達成するためのより良い方法があるかどうか、誰かがアドバイスできますか?

zip [0..] list

そして、次のようなもの:

[if (snd x)== 
             7 && let index = (fst x) 
               && (snd x)==8 && (fst x)==(index+1) 
               && (snd x)==9 && (fst x)==(index+2) 
               then "success" 
               else "fail" | x <- list]
4

4 に答える 4

8

リスト アルゴリズムを理解しようとするときは、通常、リスト ヘッドの特殊なケースについて考えることから始めるのが最善です。この場合、リストが で始まることをどのようにテストし[7,8,9]ますか?

beginsWith789 :: [Int] -> Bool
beginsWith789 (7:8:9:_) = True
beginsWith789 _         = False

つまり、最初の 3 つの要素に対してパターン マッチを実行できます。これを一般化するために、リストの先頭にサブシーケンスが見つからない場合、リストの末尾を再帰的にチェックします

contains789 :: [Int] -> Bool
contains789 (7:8:9:_) = True
contains789 (_:xs)    = contains789 xs
contains789 _         = False

これをさらに一般化して部分列を見つけたい場合は、isPrefixOf関数 fromを使用できData.Listます。

import Data.List (isPrefixOf)

contains :: Eq a => [a] -> [a] -> Bool
contains sub lst | sub `isPrefixOf` lst = True
contains (_:xs)  = contains sub xs
contains _       = False

anyandを使用しtailsて、リストの連続的に短いテールが指定されたサブシーケンスで始まるかどうかを確認することで、これを整理できます。

import Data.List (isPrefixOf, tails)

contains :: Eq a => [a] -> [a] -> Bool
contains sub = any (sub `isPrefixOf`) . tails

または、単純に標準ライブラリ関数を使用することもできますisInfixOf。;)

> import Data.List
> [7,8,9] `isInfixOf` [1,2,3,4,5,6,7,8,9]
True
于 2013-02-11T14:56:10.310 に答える
6

isInfixOfの機能をお勧めしますData.List。シーケンスを見つけるのは簡単です

let hasSequence = [7,8,9] `isInfixOf` list
于 2013-02-11T14:45:04.647 に答える
1

一部の要素が指定された順序で表示されるが、その間に他の要素が表示される場合もカウントしたいかどうかはわかりません。他の回答[7, 8, 9]は、元のサブリストであるケースのみをカウントしているようです。[7,8,9]で見つかったとしましょう[7,0,8,0,9,0]、使用できます

appears :: (Eq a) => [a] -> [a] -> Bool
appears [] _ = True
appears _ [] = False
appears ns@(n : ns') (h : hs')
    | n == h    = appears ns' hs'
    | otherwise = appears ns hs'

appears [7,8,9] [7,0,8,0,9] --> True
appears [7,8,9] [1..10]     -->  True
appears [3,8,9] [1..10]     -->  True
appears [10,8,9] [1..10]    -->  False
于 2013-02-11T15:17:47.467 に答える
1

これはどう?

elemIndex (7,8,9) $ zip3 list (tail list) (tail (tail list))

elemIndex は Data.List からのものです。

それがどのインデックスにあるか気にしない場合は、これを使用できます

elem (7,8,9) $ zip3 list (tail list) (tail (tail list))
于 2013-02-11T14:41:10.450 に答える