我試圖將字串的第一個字母大寫為大寫字母,并將所有其他字母大寫為小寫。到目前為止,這是我的代碼:
capitalize :: String -> String
capitalize word = [ toUpper x | x <- word, head` word ]
我已經嘗試了一些后衛的變體,但它們不起作用。我想使用模式匹配將字串分成頭部和尾部,但我不確定如何。有沒有辦法使用串列理解來做到這一點?
另外,我們可以在一個地方放置多個守衛嗎?因為我的印象isAlpha應該是守衛之一。
uj5u.com熱心網友回復:
我不認為串列理解是實作此特定功能的好工具。您可以使用它進行各種映射和過濾,但是沒有簡單的方法可以將串列的第一個元素與其他元素區別對待。
就個人而言,我認為撰寫此函式的最簡潔方法是簡單的模式匹配:
capitalize :: String -> String
capitalize "" = ""
capitalize (x:xs) = toUpper x : map toLower xs
capitalize "" = ""如果您確定永遠不會嘗試在空字串上使用它,則該行并不是絕對必要的,但我更喜歡撰寫永遠不會出現運行時錯誤的函式,并且可以公平地說大寫空字串應該回傳另一個空字串。
主要作業在最后一行完成,它使用x:xs模式將串列(字串在 Haskell 中只是串列)分成x頭部(或第一個字母)和xs字串的其余部分。然后我們使用toUpper使第一個字母大寫,并將map toLower其余字母變為小寫(toLower并toUpper處理字符,而不是字串,但字串是字串列,因此我們使用map該函式應用于字串中的每個字符),然后將它們與 cons 運算子一起回傳:。
uj5u.com熱心網友回復:
為了完整起見,這是一個具有串列理解的解決方案:
capitalize word = [ if i==0 then toUpper x else toLower x
| (i,x) <- zip [0..] word ]
還有一個用于加糖的語法擴展zip:
{-# LANGUAGE ParallelListComp #-}
capitalize word = [ if i==0 then toUpper x else toLower x
| i <- [0..]
| x <- word ]
if我們也可以直接在串列中使用字符修飾符,而不是需要條件的運行到無窮大的顯式索引:
capitalize word = [ m x
| m <- toUpper : repeat toLower
| x <- word ]
這也可以在沒有串列理解的情況下撰寫,而是使用顯式 zip 代替:
capitalize = zipWith id $ toUpper : repeat toLower
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316865.html
