我有一個包含多個單詞的字串,我必須檢查第一個字符是否與前一個單詞的最后一個字符相同。我被告知要使用內置函式的話。
這是我所做的:
validGame1 :: [String] -> Bool
validGame1 [] = True
validGame1 [x] = True
validGame1 (a:b:xs)
|last a == head b = validGame1 (b:xs)
|otherwise = False
但是當輸入應該為 True 時我會遇到例外
示例:validGame "bread door room mad" (這應該是 True 但它會拋出例外) validGame "bread car room mad" (這應該是 False 并且效果很好)
uj5u.com熱心網友回復:
您似乎忘記使用words. 這對我有用:
ghci> validGame1 (words "bread door room mad")
True
ghci> validGame1 (words "bread car room mad")
False
如果您想將其封裝到一個函式中,您可以撰寫:
validGame1 :: String -> Bool
validGame1 inp = go (words inp) where
go [] = True
go [x] = True
go (a:b:xs)
| last a == head b = go (b:xs)
| otherwise = False
uj5u.com熱心網友回復:
作為附錄,可以解決這個問題,而無需words簡單地使用遞回和模式匹配。
check :: [Char] -> Bool
check "" = True
check [_, _] = True
check (a:tl@(' ':b:c))
| a == b = check tl
| otherwise = False
check (_:tl) = check tl
我們可以考慮任何一兩個字串來滿足規定的規范。
對于三個或更多字符,如果中間字符是空格,如果兩邊的兩個字符相同,我們可以檢查字串的尾部。否則我們知道字串沒有通過檢查并回傳False。
如果字串是三個或更多字符,但中間字符不是空格,則繼續檢查字串的尾部。
注意:這不處理單詞由多個空格分隔的字串。
如果我們想處理這種情況,我們可以在函式中添加一些模式。
check :: [Char] -> Bool
check "" = True
check [_, _] = True
check (' ':tl@(' ':b:_)) = check tl
check (a:tl@(' ':' ':_)) = check $ a:' ':(dropWhile (== ' ') tl)
check (a:tl@(' ':b:_))
| a == b = check tl
| otherwise = False
check (_:tl) = check tl
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528511.html
標籤:哈斯克尔
下一篇:為FFI測驗生成有狀態函式指標
