【问题标题】:Filtering String from List Haskell从列表 Haskell 中过滤字符串
【发布时间】:2015-05-08 16:15:18
【问题描述】:

我正在尝试编写一个程序来读取文本文件,然后显示文件中单词的频率和计数。接下来我需要做的是从文本文件中过滤某些单词。我一直在寻找在线资源几个小时,但仍然找不到我要找的东西!

到目前为止,我已经为该程序提供了我的代码:

lowercase = map toLower
top doc = wordPairs
    where
        listOfWords = words (lowercase doc)
        wordGroups  = group (sort listOfWords)
        wordPairs   = reverse
                    $ sort
                    $ map (\x -> (length x, head x))
                    $ filterWords
                    wordGroups

filterWords :: String -> String
filterWords = filter (all (`elem` ["poultry outwits ants"])) . words

【问题讨论】:

  • 您是否要过滤掉"poultry""outwits""ants"这些词?函数 ``` elem ["poultry outwits ants"]``` 只会过滤掉匹配精确值 "poultry outwits ants" 的字符串,而不是任何字符串 "poultry""outwits""ants"
  • 另外,不要在 Haskell 中使用制表符。这是可能的,但你更有可能遇到奇怪的语法错误。只需使用空格,它们总是有效的。
  • @bheklilr 是的,这正是我想要做的。我已将过滤器代码更改为 'filterWords :: String -> [String] filterWords = filter (elem ["poultry", "outwits", "ants"] .words' 但它仍然给我同样的错误 "parse错误(可能是不正确的缩进或不匹配的括号)”我不知道如何解决这个问题。谢谢
  • 先将制表符更改为空格,这有帮助吗?之后你只会有类型错误(我认为)
  • 缩进。您最初发布的代码中有制表符。每当您按下键盘上的 Tab 键时,您应该能够配置您的编辑器以插入一定数量的空格(我喜欢 4 个)。如果你不能让你的编辑器做到这一点,停止使用 notepad.exe 并获得一个真正的编辑器:P

标签: string list haskell


【解决方案1】:

如果您以不同的方式拆分程序,可能会更容易。例如

import Data.List(group,sort)
import Control.Arrow((&&&))

freq :: Ord a => [a] -> [(Int,a)]
freq = reverse . sort . map (length &&& head) . group . sort

第二部分将定义这个函数的输入。您只想过滤某些元素。

select :: Eq a => [a] -> [a] -> [a]
select list = filter (`elem` list)

这些将使测试更容易,因为您不需要特定类型的输入。

最后,你可以把它们绑在一起

freq $ select ["a","b","c"] $ words "a b a d e a b b b c d e c"

会给你

[(4,"b"),(3,"a"),(2,"c")]

【讨论】:

    【解决方案2】:

    我的代码可以解决你的问题

    top :: String -> [(Int,String)] --Signature is always important
    top = sorter . wordFrequency . groups . filtered --just compose `where` functions
        where
            -- This will filter your words
            filtered = filter (`notElem` ["poultry","outwits","ants"]) . words . map toLower 
            -- Group your words
            groups = group . sort 
            -- Create the pairs of (count, word)
            wordFrequency = map (length &&& head)
            -- Sort your list by first. for reverse just switch a and b
            sorter = sortBy (\ a b -> fst b `compare` fst a)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-22
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多