2014-11-06 5 views
1

상호 작용을 사용하여 Haskell 프로그램을 만들려고합니다. 가장 많이 사용 된 단어와 횟수가 반환됩니다. 정렬과 예제를 보았습니다 -하지만 모든 단어에 대한 개수를 알 필요가 없습니다, 나는 단지 가장 반복 된 단어가 필요합니다. 지금까지 나는 가지고있다 :Haskell - 상호 작용이있는 목록에서 가장 반복되는 요소를 계산합니다.

import Data.List -- (sort) 
import Data.Char -- (isAlpha, toLower) 
import Data.Ord -- (maximumBy) 

main = 
    interact 
    $ unwords 
    -- comment: here show the size of the list and the word (probably head) 
    . maximumBy(comparing length) 
    . group 
    . sort 
    . words 
    . map (\char -> if isAlpha char then toLower char else ' ') 

위의 컴파일. 시간 "the" 텍스트에 표시되는 단어의 수를

[the, the, the, the, the, the, the, the...] 

; maximumBy는 다음과 같이 가장 많이 사용되는 단어를 제공합니다 나는 "the"이 내가 제공 한 텍스트에서 가장 많이 사용되는 단어임을 확인했습니다.

: 출력을 제공

import Data.List -- sort 
import Data.Char -- isAlpha, toLower 
import Data.Ord -- maximumBy 

main = 
    interact 
    $ unwords 
    . map (\(n, w) -> show n ++ ", " ++ show w) 
    . map (\s -> (length s, head s)) 
    . maximumBy(comparing length) 
    . group 
    . sort 
    . words 
    . map (\char -> if isAlpha char then toLower char else ' ') 

:

"the, 318" 나는 첫 번째 문자 "T"와 3을 제공하는 다음과 같은 시도 :

이 같은 내가 출력하고자입니다

"3, 't' 3, 't' 3, 't' 3, 't' ..." 

누구나 내가 뭘 잘못하고 있는지 알아?

답변

1

map (\s -> (length s, head s))map 함수 \s -> (length s, head s) 반복 길이 "the"의 첫 문자를주는 각 "the""the" 대신에 '(S)의 목록에 적용하는 것을 의미한다. 따라서 map을 제거하면 더 잘 작동합니다. 당신이

당신을 수있는 최대 값보다 파이프 라인에 이전 map (\s -> (length s, head s))을 적용 할 수 있습니다, 더 효율적으로

$ (\(n, w) -> show n ++ ", " ++ show w) 
    . (\s -> (length s, head s)) 
    . maximumBy(comparing length) 

: 당신은 또한 마지막 두 단계합니다 (unwordsmap를 제거을)를 해결해야합니다 각 비해 최대 기능을 length을 다시 계산

  1. 피가
  2. 사용 그냥 일반 maximum 대신 maximumBy의 작업을 수행합니다. (그 다음 실제 문자열을 비교 때문에 ,이 똑같이 자주 사람이있는 경우 단어 선택되는 약간 다를 수 있습니다.) 즉

, 당신이 사용할 수있는

$ (\(n, w) -> show n ++ ", " ++ show w) 
    . maximum 
    . map (\s -> (length s, head s)) 

또는 모두 함께 넣어 :

import Data.List (group, sort) 
import Data.Char (isAlpha, toLower) 

main = 
    interact 
    $ (\(n, w) -> show n ++ ", " ++ show w) 
    . maximum 
    . map (\s -> (length s, head s)) 
    . group 
    . sort 
    . words 
    . map (\char -> if isAlpha char then toLower char else ' ') 

참고 또한 내가 명시 적으로 가져 오는 어떤 이름의 공식 구문을 사용하는 import 문을 변경하는 방법 . 난 강력하게 권하고 싶습니다 당신이 놓친 하나의 기능 (group)과 잘못된 모듈을 나열한 하나 (maximumBy)를 지적하는 오류 메시지를 실제로 주석을 사용하는 것이 좋습니다.

+0

도움 주셔서 감사합니다. 이것이 제가 시도한 해결책이었습니다. – Zorkolot

관련 문제