2017-02-19 37 views
1

任務是計算一個字符串中的所有標點符號。我如何檢查角色是否屬於這個組「。,!?;:」。我這樣做如何檢查字符是否屬於Haskell中的一組符號?

signs' curSgn ('.':list) = (signs' (curSgn + 1) list) 
signs' curSgn (',':list) = (signs' (curSgn + 1) list) 
signs' curSgn ('?':list) = (signs' (curSgn + 1) list) 
signs' curSgn ('!':list) = (signs' (curSgn + 1) list) 
signs' curSgn (':':list) = (signs' (curSgn + 1) list) 
signs' curSgn (';':list) = (signs' (curSgn + 1) list) 

但是有沒有辦法在一行代碼中做到這一點?

+0

'PUNC ::字符串 - > Int'實現例如作爲'PUNC =長度。 (「?!,:;」 \'ELEM \')'過濾器@ – jakubdaniel

+0

您jd823592應該發表您的評論作爲一個答案,這樣就可以得到接受和upvoted和幫助其他人更容易找到答案。 –

回答

5

您可以提取您有興趣與filter符號和計數使用length的出現次數。 Filter獲取值列表並返回包含滿足某些屬性(例如作爲標點符號)的值的最大子列表。

punctuation :: String -> Int 
punctuation s = length (filter (...) s) 

什麼是...?它需要判斷一個字符是一個標點符號或沒有,即Char -> Bool類型的謂語。如何判斷一個角色是否在給定的列表中?

isPunctuation :: Char -> Bool 
isPunctuation c = c `elem` ['.', ',', '?', '!', ':', ';'] 

把這些一起

punctuation :: String -> Int 
punctuation = length . filter (`elem` ".,?!:;") 

通知,字符['.', ...]的列表實際上是一個字符串,你可以把它寫在短".,?!:;"。同樣注意到無點符號,而不是根據其唯一參數s的作用定義punctuation,我們說功能punctuation等於功能lengthfilter ...的組合。還要注意section符號用於結合的elem而不是第一第二個參數。還有isPunctuation

+0

@Daniel Wagner:感謝編輯,一個愚蠢的錯字。 – jakubdaniel

相關問題