2017-02-07 12 views
1

文字列の文字数を再帰関数と組み合わせてカウントしようとしていますが、動作していないようです。再帰関数の文字列内のCharのインスタンスをカウントする

{- characterCounts s 
    PRE: True 
POST: a table that maps each character that occurs in s to the number of 
    times the character occurs in s 
EXAMPLES: 
-} 
characterCounts :: String -> Table Char Int 
characterCounts [] = Table.empty 
characterCounts s = characterCountsAux s Table.empty 

characterCountsAux:: String -> Table Char Int -> Table Char Int 
characterCountsAux [] table = table 
characterCountsAux (x:xs) table = characterCountsAux xs (Table.insert (table) x (count x (x:xs))) 


count:: Char -> String -> Int 
count c s = length $ filter (==c) s 

ので、私が行う場合には:characterCounts "atraa"私はT [('a',3),('t',1),('r',1)]を取得する必要がありますが、代わりに私がT [('a',1),('t',1),('r',1)]を取得します。

提案をいただければ幸いです。

+0

念のために:される[この](HTTPS ://hackage.haskell.org/package/tables-0.4.1.1/docs/Data-Table.html)あなたが使っている 'Table'タイプは? – duplode

+0

私は前の宿題の問題から 'テーブル'を覚えています。私はそれが単なる連想リストだと思っています、それを実装するための以前の宿題だったかもしれません。 – jberryman

+0

newtypeテーブルa b = T [(a、b)] –

答えて

1

「テーブル」モジュール(GHC内)はありません。

あなたのコードは奇妙に見えます:あなたはすべての文字をループして、カウントするとき(ただしリストの末尾のみ)ループしているようです。

他のコメントにリンクされているテーブルモジュールには「カウント」機能があります。

おそらく

Table.insert table x ((count table x) + 1) 

ような何かをし、あなたの "カウント" 機能を削除してください。

追加:テーブル内の最初のcharの出現も処理する必要があります。

1

あなたのテーブルはマップのように見えます。あなたが地図を使用できるのであれば、あなたは次のことを試みることができる:

import qualified Data.Map as M 

characterCounts :: [Char] -> M.Map Char Int 
characterCounts = foldr ((flip $ M.insertWith (+)) 1) M.empty 

さて、characterCounts "atraa"戻りfromList [('a',3),('r',1),('t',1)]、すなわちMap Char IntTable Char Intあなたが求めているに似ています。必要に応じて変換を実装するのは簡単です。

1

あなたがcharacterCountsAux xs _を呼び出すと、関数は残りのリストに与えられます。すなわち、第4の反復であなたがT [( 'A'、2)、( 'T'、1)、(R ''、1)]に、テーブルを変更し、

characterCountsAux "aa" T [('a',3),('t',1),('r',1)] 

を呼び出していることを意味しますあなたは、最終的なT [( 'A'、1)、( 'T'、1)、( 'R'、1)]を与え、我々は

characterCountsAux "a" T [('a',2),('t',1),('r',1)] 

を持って次の繰り返し。

素朴な解決策は、xsからxの出現をすべて削除することになる、それは非常に効率的では見えません。もちろん、

characterCountsAux (x:xs) table = characterCountsAux (filter (/= x) xs) (Table.insert (table) x (count x (x:xs))) 

、すなわち...

+0

ビンゴ!私は後方への再帰を考えていた! –

関連する問題