2012-04-22 85 views
1

我正在學習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."

我希望有人能幫助我解決這個問題。 感謝您的幫助!

編輯:感謝您的幫助,現在它看起來像這樣:

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是轉變barbaz,你可以使用map foo轉化成[bar][baz]

filter,像map,其是,給定一個謂詞函數和一個列表高階函數,返回一個由元素的列表的量,謂詞是True。在這種情況下,我們給出謂詞函數(/=""),即所有非空的字符串爲True

+0

我編輯我的問題,感謝您的幫助,您可以幫我多一點做呢?我需要把過濾器放在哪裏? – Zomil 2012-04-22 18:18:44

+0

我編輯了示例以適合您的新代碼。 – Sarah 2012-04-22 18:22:47

+0

非常感謝你:) – Zomil 2012-04-22 19:28:28

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..",""] 
相關問題