【问题标题】:identifying number of words in a paragraph using haskell使用haskell识别段落中的单词数
【发布时间】:2013-12-30 00:41:08
【问题描述】:

我是 Haskell 和函数式编程的新手。我有一个包含一些段落的.txt 文件。我想用 Haskell 计算每个段落中的单词数。

我已经编写了输入/输出代码

paragraph-words:: String -> int


no_of_words::IO()
no_of_words=
do
    putStrLn "enter the .txt file name:"
    fileName1<- getLine
    text<- readFile fileName1
            let wordscount= paragraph-words text

谁能帮我写出功能段落单词。这将计算每个段落中的单词数。

【问题讨论】:

    标签: haskell


    【解决方案1】:

    首先:你不想被肮脏的IO()打扰,所以签名应该是

    wordsPerParagraph :: String -> [Int]
    

    至于这样做:您应该首先将文本分成段落。那么计算每个单词中的单词非常简单。

    您基本上需要的是匹配空行(两个相邻的换行符)。所以我首先使用lines 函数,给你一个行列表。然后你将它们分开,在每个空行:

    paragraphs :: String -> [String]
    paragraphs = split . lines
     where split [] = []
           split (ln : "" : lns) = ln : split lns
           split (ln : lns) = let (hd, tl) = splitAt 1 $ split lns
                              in (ln ++ hd) : tl
    

    【讨论】:

    • 谢谢.. 但我收到错误消息“*** 表达式:ln ++ hd *** 术语:ln *** 类型:[Char] *** 不匹配:[ [字符]]"
    【解决方案2】:

    如果一个人占用所有行直到到达至少一个空行 ("") 或列表用完 (1),则可以将行列表拆分为多个段落。我们忽略所有连续的空行 (2) 并对其余行应用相同的方法:

    type Line      = String
    type Paragraph = [String]
    
    parify :: [Line] -> [Paragraph]
    parify [] = []
    parify ls 
      | null first = parify rest          
      | otherwise  = first : parify rest
      where first = takeWhile (/= "") ls  -- (1) take until newline or end
            rest  = dropWhile (== "") . drop (length first) $ ls
                 -- ^ (2) drop all empty lines
    

    要将字符串拆分成行,您可以简单地使用lines。要获得Paragraph 中的字数,您只需将每行中的字数相加

    singleParagraphCount :: Paragraph -> Int
    singleParagraphCount = sum . map lineWordCount
    

    每一行的单词就是length . words

    lineWordCount :: Line -> Int
    lineWordCount = length . words
    

    所以总而言之,我们得到以下函数:

    wordsPerParagraph :: String -> [Int]
    wordsPerParagraph = map (singleParagraphCount) . parify . lines
    

    【讨论】:

      【解决方案3】:

      首先,您不能在函数名中使用-,而必须使用_(或者更好,使用如下leftroundabout建议的camelCase)。

      这是一个满足您的类型签名的函数:

      paragraph_words = length . words
      

      这首先将文本拆分为单词列表,然后通过返回该单词列表的长度来计算它们。

      但这并不能完全解决问题,因为您还没有编写代码来将文本分成段落。

      【讨论】:

      • 在 Haskell 程序员中使用下划线是非常罕见的,使用 CamelCase 约定绝对是更可取的。
      猜你喜欢
      • 2016-07-29
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多