我试图使用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' ..."
任何人都知道我做错了什么?
答案 0 :(得分:1)
map
中的map (\s -> (length s, head s))
表示函数\s -> (length s, head s)
适用于每个"the"
而不是"the"
列表,反复给出长度和"the"
的第一个字符。因此删除map
应该会更好。您还需要修改最后两个步骤(删除unwords
和map
):
$ (\(n, w) -> show n ++ ", " ++ show w)
. (\s -> (length s, head s))
. maximumBy(comparing length)
更高效的是,您可以在管道中应用map (\s -> (length s, head s))
之前的而不是最大值,这样就可以
length
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
)你用错误的模块列出的。(/ p>