2017-10-10 2 views
0

그래서 단어 목록을 받아 새 목록에있는 anagrams를 반환하는 함수를 만들려고합니다. 이것은 내가 지금까지 가지고있는 것이다 :하스켈에서 anagrams를 확인하기위한 함수 만들기

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의 오류 메시지는 (잘하면) 코드 문제를 찾는 데 도움이됩니다. 또한, 하스켈 (Haskell)에서는 두 개의 인자 ('f :: (a, b) -> c')를 갖는 함수를 카레 함수'f :: a-> b-> c'로 쓸 수있다. – cdk

답변

1

멋진 시작!

이 컴파일을 수행하는 데 필요한 최소한의 변경은 nil을 모든 곳에서 []으로 바꾸고 인수 주변의 괄호를 find으로 바꿔야합니다. 따라서 :

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

-- change two 
listana [] = [] 

많은 개선점이 있습니다. Data.List 모듈을 훑어보고 거기에 구현 된 기능 중 어떤 것이 유용하게 보이는지 확인하십시오. Data.Map을 사용하여 이것을 한 줄짜리 항목으로 그룹화하는 표준 트릭도 있습니다. 힌트는 another answer of mine을 참조하십시오.

관련 문제