2013-10-14 1 views
0

하나의 단어가 단어 목록의 접두사 인 횟수를 반환하는 함수를 만들고 싶습니다. 예를 들어, 단어 "go"와 단어 목록 [ "ace", "going", "gone", "golf"]에 대해서는 3을 반환해야합니다 :내가 어떻게 haskell에서 접두사를 셀 수 있습니까?

numberOfPrefixes _ [] = error ("Empty list of strings") 

numberOfPrefixes [] _ = error ("No word") 

numberOfPrefixes (x:xs) (y:ys) 

         | isPrefixOf (x:xs) y = 1 + numberOfPrefixes(x:xs) ys 

         | otherwise = 0 

그러나 이것은 단어 목록의 첫 번째 요소가 실제로 접두사 인 경우에만 작동합니다. 첫 번째 요소가 접두어가 아니면 전체가 분리됩니다. 이 권리를 만드는 어떤 도움? 여기

isPrefixOf :: (Eq a) => [a] -> [a] -> Bool 
isPrefixOf [] _ = True 
isPrefixOf _ [] = False 
isPrefixOf (x:xs) (y:ys) = x == y && isPrefixOf xs ys 
+0

입니다. 안녕하세요, 저는 새로운 답변을 알고 있습니다.하지만 내 대답에 대한 질문이 있으면 내 답변에 대한 의견으로 게시하여 볼 수 있습니다. :) 둘째로, 들여 쓰기를 수정하고'y : ys'를 수표에서'y'로 변경하면 잘 작동합니다. – jozefg

+0

그래서 지금 다른 질문이 있습니다. 어떤 도움이 필요합니까? 그리고 귀하의 조언을 주셔서 감사합니다, 그것은 매우 도움이되었다 –

+0

별도의 질문으로 이것을 게시하고 나는 행복 할거야. – jozefg

답변

3

당신이 정말로 재귀

prefixCount l [] = 0 
prefixCount x (l:ls) | <is prefix?> = 1 + prefixCount x ls 
         | otherwise = prefixCount x ls 

그것을 작성하고 바로 입력 할 경우, 나는이

(.:) :: (b -> c) -> (a -> a1 -> b) -> a -> a1 -> c 
(.:) = (.) . (.) -- A common utility definition 
infixr 9 .: 

prefixCount :: Eq a => [a] -> [[a]] -> Integer 
prefixCount = length .: filter . isPrefixOf 

을 써서 아니면이 pointfully

prefixCount l ls = length $ filter (isPrefixOf l) ls 

를 작성하는 방법에에 x이 접두사인지 여부는 l

+0

재귀 솔루션을 설명해 주시겠습니까? 나는 그것을 이해하려고 힘든 시간을 보내고 있기 때문에. 조금 더 단순하게 만들 수 있습니까? –

+0

@ user2878641 빈 목록에는 오른쪽 접두사가있는 0 개의 요소가 있습니다. 그렇지 않으면 첫 번째 요소를 가져 와서 나머지 목록의 나머지 개수에 1을 추가합니다. 그렇지 않으면, 목록의 나머지 부분에 0을 더한다. – jozefg

+0

나는 이것을 작성하기 위해 이전에 작성한이 함수를 사용하고자한다 : isPrefixOf :: (aq) => [a] -> [a] -> Bool isPrefixOf [] _ ​​= True isPrefixOf _ [] = False isPrefixOF (x : xs) = x == y && isPrefixOf xs y –

관련 문제