Haskell过滤了要列出的字符串

时间:2014-11-11 19:22:55

标签: string list haskell filter

我想要一个功能,你输入一个像#34的字符串;你好我25岁!"并获得一个列表,如["你好","我","我","年","旧& #34]。所以它应该将所有大写字母都放在小写中并删除所有不是字母的内容。它应该只使用Data.List和Data.Char。 我知道我应该在字符串上使用单词,然后过滤它,但我不能弄明白(是的,我是Haskell的新手)。

toString :: String -> [String]
toString str = ...

2 个答案:

答案 0 :(得分:2)

冒着回答作业问题的风险:

import Data.Char

toString :: String -> [String]
toString str = filter (not . null) . map (map toLower . filter isAlpha) . words $ str

Prelude Data.Char> toString "Hello I am 25 years old!"
["hello", "i", "am", "years", "old"]

答案 1 :(得分:0)

这将是我的工作流程:使用hoogle并使用您需要的类型签名。

  1. 关于如何获取单词列表:您需要一个“一二三”的函数foo - > [“one”,“two”,“three”]所以它有类型签名:String -> [String]。通过hoogle搜索确切的此类型签名,您会在结果列表中找到函数words

  2. 执行大写的方法通常会使用类型签名Char -> Char。将其输入到hoogle中,您会在列表中的第三位找到toUpper

  3. 是一封信:Char - >布尔

  4. 然后打开ghci并试用这些功能。 IE:

    ghci> :t toUpper -- will print the type of isUpper

    <interactive>:1:1: Not in scope: ‘isUpper’ - 您需要导入Data.Char

    ghci> import Data.Char - 所以让我们导入Data.Char

    ghci> toUpper "abc"

    ghci> words "a quick brown fox"

    ghci> :t map

    ghci> map toUpper ["a", "quick"]

  5. ......等等

    你仍然需要弄清楚如何将这些部分与地图和过滤器放在一起但是我建议你仔细查看这些部分。