Haskell - 使用交互计算列表中最重复的元素

时间:2014-11-06 09:43:35

标签: haskell count

我试图使用interactive创建一个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 ' ')

以上编译。 maximumBy给出了最常用的单词:

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

单词"the"出现在文字中的次数;我已经确认"the"是我提供的文字中最常用的字词。

我想要输出的内容是这样的:"the, 318"

我尝试了下面的第一个字母" t"和3:

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 ' ')

给出了输出:

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

任何人都知道我做错了什么?

1 个答案:

答案 0 :(得分:1)

map中的map (\s -> (length s, head s))表示函数\s -> (length s, head s)适用于每个"the"而不是"the"列表,反复给出长度和"the"的第一个字符。因此删除map应该会更好。您还需要修改最后两个步骤(删除unwordsmap):

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

更高效的是,您可以在管道中应用map (\s -> (length s, head s)) 之前的而不是最大值,这样就可以

  1. 避免在最大函数的每次比较中重新计算length
  2. 仅使用maximum而不是maximumBy。 (如果有两个同等频繁的词,那么可能略有不同,因为它会比较实际的字符串。)
  3. 换句话说,您可以使用

       $ (\(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)你用错误的模块列出的。(/ p>