2016-11-03 5 views
4

特にStringsの要素です。したがって、["so", "what", "and", "so", "for" "so"]となり、返信は["so", "so", "so"]となります。私の問題は、私の関数が入力されたものと同じリストを返すということです。リストをとり、最初の要素と同じすべての要素のリストを返しますが、関数が機能していない関数を作成しようとしています

ここでは、関連するすべてのコードです:

lookAhead :: [String] -> String 
lookAhead [] = [] 
lookAhead (c:cs) = c 

groupFirst :: [String] -> [String] 
groupFirst [] = [] 
groupFirst (x:xs) 
    | lookAhead xs == x = x : (groupFirst ((lookAhead xs):(tail xs))) 
    | lookAhead xs /= x = x : (groupFirst xs) 
    | lookAhead xs == [] = x : [] 
+2

デバッグの1つの方法は、入力を渡すときに各ステップで何が起こるかを注意深く考えることです。あなたは '[" "so"、 "what"] 'で始めることができます。それでも問題が解決しない場合は、ソリューションを小さな部分に分割してください。 – jberryman

+1

'x'が各再帰的ステップでリストの最初の要素であれば、それをどのように比較したいですか?この比較で扱う必要があるケースはいくつありますか?結果リストに 'x'をいつ含めるのですか? – duplode

答えて

2

実装に問題がgroupFirst以内に、あなたは、リストを反復処理していると、リストの先頭に([String]型を持つ)リストの尾を比較するということですが、 (String)。したがって、すべての比較は2番目のガードとマッチし、同じリストを構築することになります。

ファンクションコールを変更せずにリスト全体を反復できるように、最初の文字列をアクセス可能にする方法を見つける必要があります(f strListではなく、f firstStr strList)。引数としてリストの先頭を渡し、関数が別の関数を呼び出すことによって、この問題を解決する1つの方法:

lookAhead :: [String] -> [String] 
lookAhead [] = [] 
lookAhead (x:xs) = x : check x xs 

check :: String -> [String] -> [String] 
check str = foldr (\x acc -> if x == str then x:acc else acc) [] 
+3

OPは、 'head'と' tail'の代わりにlist引数にパターンマッチングを使うことで正しいものでした。それを変えないでください。 – chepner

+1

空リストを指定すると 'lookAhead'がクラッシュします。 (他の2つの答えは、リストが空のときにブールテストが実際には適用されないので、この運命を逃れることができて幸運です)。 – duplode

1

lookAhead機能は、最初の要素と、その値がgroupFirst機能に再帰的に更新されて返されます。ヘッド要素-平等-前提filterとして

groupFirst :: [String] -> [String] 
groupFirst [] = [] 
groupFirst list = [x | x <- list, head list == x] 
+4

ここでクラッシュすることはありませんが、「頭」と「尾」は悪です。それらを避けてください。パターンマッチングによって両方のケースを処理し、空のリストが与えられたときに何をするかを決めます。これは他の回答にも当てはまります。 – duplode

6

trail:あなたはそれを行うことの一つの方法は、リストの内包表記を使用している

trail :: Eq a => [a] -> [a] 
trail []  = [] 
trail (x : xs) = x : filter (== x) xs 

trailBySchwartzian transformmemoizationを使用して:

trailBy :: Eq b => (a -> b) -> [a] -> [a] 
trailBy _ []  = [] 
trailBy f (x1 : xs) = let x1f = f x1 
         in x1 : filter (\ x -> f x == x1f) xs 

trail = trailBy id、ここで、id x = x、ハスケルのアイデンティティ関数。

+6

ここではクラッシュは発生しませんが、 'head'と' tail'は悪です。それらを避けてください。パターンマッチングによって両方のケースを処理し、空のリストが与えられたときに何をするかを決めます。 (これは他の回答にも当てはまります。) – duplode

関連する問題