2017-10-10 14 views
0

私は単語のリストを取り、アナグラムを新しいリストに返す関数を作成しようとしています。これはこれまで私が持っているものです:ハスケルでアナグラムをチェックするための関数を作成する

quicksort :: Ord a => [a] -> [a] 
quicksort []  = [] 
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater) 
    where 
     lesser = filter (< p) xs 
     greater = filter (>= p) xs 

sub(a,[]) = [] 
sub(a,b:c) = if a == b then c else b:(sub(a,c)) 

sublist([],a) = a 
sublist(a:b,c) = sublist(b,sub(a,c)) 

anagram a b = quicksort (a) == quicksort (b) 

find a,[] = nil 
find (a, b:c) = if anagram a b then b:(find(a,c)) else find(a,c) 

listana [] = nil 
listana (a:c) = list:(listana(sublist(list,a:c))) 
       where list = a:(find(a,c)) 

私のfind関数には問題があると確信しています。 オハイオ州と私はハスケルに新しいので、私に簡単に行ってください。

+0

関数に明示的な型シグネチャを追加してみてください。 GHCのエラーメッセージはあなたのコードで問題を見つけるのを助けてくれるはずです。また、ハスケルでは、2つの引数( 'f ::(a、b) - > c')をカリー関数(' f :: a - > b - > c')として書くことができます – cdk

答えて

1

素敵なスタート!

このコンパイルを行うために必要な最小限の変更は、nilをどこでも[]に置き換えて、引数の前後のかっこをfindに囲むことです。したがって:

-- change one 
find (a,[]) = [] 

-- change two 
listana [] = [] 

そこから多くの改善があります。 Data.Listモジュールを突き抜けてそこに実装されている機能が有用かどうかを確認することをお勧めします。 Data.Mapを使用して、これを1ライナーにするアイテムをグループ化する標準的な方法もあります。ヒントについてはanother answer of mineを参照してください。

関連する問題