Haskell:将字符串转换为句子

时间:2012-04-22 17:47:12

标签: haskell

我正在学习haskell而且我遇到了问题。 类型必须为:sentences :: [String] -> [String]

我想将字符串转换为句子

["something","","Asd dsa abc","hello world..",""] 

看起来像这样:["Something.","Asd dsa abc.","Hello world..."]

我想使用像地图这样的高阶函数。 我只是想弄清楚如何做到这一点。

我设法使用单个字符串:

import Data.Char
sentences :: String -> String
sentences [] = []
sentences (a:as) = (( toUpper a):as) ++ "."

所以我从中得到了:

sentences "sas das asd"

这:"Sas das asd."

我希望有人可以帮我解决这个问题。 谢谢你的帮助!

编辑:感谢您的帮助,现在看起来像这样:

import Data.Char
sentences :: [String] -> [String]
sentence (a:as) = ((toUpper a):as)++['.']
sentences = map sentence

但我不知道把过滤器放在哪里

2 个答案:

答案 0 :(得分:7)

你的函数加上map会让你走一半,但它不会从你的字符串列表中删除空字符串。您可以使用过滤器执行此操作,因此总计

sentences ss = map sentence $ filter (/="") ss

请注意sentences(复数)的核心只是sentence(单数)在字符串列表上的映射。过滤器仅用于删除空字符串。没有这个要求,它只是sentences ss = map sentence ss

现在,您可以使用字符串列表调用sentences以转换每个元素,但filter

删除的空字符串除外

一般情况下,如果您有一个将foo转换为bar的函数baz,则可以使用map foo[bar]转换为[baz] }

filtermap一样,是一个高阶函数,给定谓词函数和列表,返回一个由谓词为True的元素组成的列表。在这种情况下,我们为所有非空字符串提供谓词函数(/="")True

答案 1 :(得分:0)

您也可以使用列表理解

来完成
import Data.Char

capFirst (l:ls) = toUpper l : ls ++ "."

sentences strings = [
                     capFirst sentence | sentence <- strings,
                     sentence /= []
                    ]

main = print $ sentences ["something","","Asd dsa abc","hello world..",""]