1

我正在学习haskell,但遇到了问题。类型必须是: sentences :: [String] -> [String]

我想把字符串转换成句子

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

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

我想使用像map这样的高阶函数。我只是不知道怎么做这个。

我设法使用单个字符串:

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

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

4

2 回答 2

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, like map, 是一个高阶函数,给定一个谓词函数和一个列表,返回一个列表,该列表由谓词所针对的元素组成True。在这种情况下,我们给出谓词函数(/=""),它True适用于所有非空字符串。

于 2012-04-22T17:52:39.157 回答
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..",""] 
于 2012-04-22T19:34:54.490 回答