我正在学习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
但我不知道把过滤器放在哪里
答案 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]
}
filter
与map
一样,是一个高阶函数,给定谓词函数和列表,返回一个由谓词为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..",""]