2017-01-19 5 views
0

タプルの中の特定のパターンを検索するリストを実装しようとしています(タプルのリストを通り、これを空にしてパターンにマッチする)最後に入力したリストは空になり、次にこのリストに一致するタプルが書き込まれます。ハスケルエラー:関数内の非排他的パターン

(使用する機能は、すべての作業を行う - 間違いはこの部分である)

PatternFinder :: String -> [(String, String)] , [(String, String)] 
PatternFinder = n ((b,a) : xs) = 
if PatternFits n a 
then do 
PatternFinder n xs 
(b,a) : xs 
else PatternFinder n xs 
+1

大文字で始まる関数を定義することはできません。これはデータコンストラクタ用に予約されています。あなたのインデントは構文エラーの原因にもなります。将来は実際のコンパイルコードをそのまま貼り付けてください。 –

答えて

2

質問の文章から、各ペアの第2項に基づいた簡単なフィルタが必要なようです。

patternFinder n = filter (patternFits n . snd) 

これがどのように機能するかの図として。

if patternFits n a 
then (b,a) : xs 
else patternFinder n xs 

これは最初に一致したリストの接尾辞を返します。

filter ((==1) . snd) [('a',1),('b',2),('c',1)] 

戻りチャドギルバートの答えで

[('a',1),('c',1)]は、しかし、その後、句には再帰はありません。これは意図した動作がある場合は、代わりに使用できます。

patternFinder n = dropwhile (not . patternFits n . snd) 

をこの例として:

dropWhile (not . (==2) . snd) [('a',1),('b',2),('c',1)] 

戻り[('b',2),('c',1)]

また、あなたの質問の本文中にあなたがいることが必要です入力したリストは空になります。これらの関数は元のリストには何もしませんが、新しいリストを返します。

+0

うわーこれはよく説明されています。これは今すぐ動作します - 良い助けをありがとう:) – Fapprentice

2

あなたは空のリストである第2引数の場合ではありません。網羅的であるためには、あなたは、このパターンを処理する必要があります。

patternFinder n [] 

あなたはまた、他の構文エラーを持っています。関数名は小文字で始まり、署名は->ではなく,ではなく、モナドコンテキストではないためdoという文は必要ありません。おそらくこれは次のようになります。

patternFinder :: String -> [(String, String)] -> [(String, String)] 
patternFinder n [] = [] 
patternFinder n ((b,a) : xs) = 
    if patternFits n a 
    then (b,a) : xs 
    else patternFinder n xs 
+0

私は、 "patternFinder n [] = xs"を追加することでそれを試みましたが、私はいつもスコープ内に変数を持っていませんでした... – Fapprentice

+0

まずリストを空にしてから、しかし、私はその問題を解決する方法がわかりません... – Fapprentice

+0

あなたは他の構文エラーがたくさんあります –

関連する問題