2012-04-22 2 views
1

Im learning haskell, и у меня возникла проблема. Тип должен быть: sentences :: [String] -> [String]Haskell: Преобразование строк в предложения

Я хочу, чтобы преобразовать строки в предложении

["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."

Я надеюсь, что кто-то может помочь мне с этой проблемой. Спасибо за помощь!

Edit: Спасибо за вашу помощь теперь выглядит следующим образом:

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

Но я не знаю, где поставить фильтр

ответ

7

Ваша функция в сочетании с картой получает вас половину пути, но не удаляет пустые строки из списка строк. Вы можете сделать это с помощью фильтра, так что в общем

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 для всех строк, которые не являются пустыми.

+0

Я отредактировал мой вопрос, спасибо за вашу помощь, вы можете помочь мне немного больше? Где мне нужно поставить фильтр? – Zomil

+0

Я отредактировал пример, чтобы он соответствовал вашему новому коду. – Sarah

+0

Еще раз спасибо! :) – Zomil

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..",""] 
Смежные вопросы