我想我错过了一个元素列表的情况,但我找不到编写它的方法,有人可以帮助我吗?
getBoard :: [String] -> [String]
getBoard (h:t) | isLOL h = h: getBoard (t)
| otherwise = []
isLOL :: String -> Bool
isLOL [ ] = True
isLOL (h:t) | h>='a' && h<='z' || h >='A' && h<='Z' = isLOL t
| otherwise = False
getBoard [] = []
是您想要的行。喜欢这个:
getBoard :: [String] -> [String]
getBoard [] = []
getBoard (h:t) | isLOL h = h: getBoard (t)
| otherwise = []
isLOL :: String -> Bool
isLOL [] = True
isLOL (h:t) | h>='a' && h<='z' || h >='A' && h<='Z' = isLOL t
| otherwise = False
首先,在你对getBoard
的定义中,问题是在模式(在你的情况下h:t
)匹配后检查守卫(|
之后的东西)。因此,如果getBoard
参数与h:t
不匹配(即[]
),则不检查两个分支(包括otherwise
分支)。解决方案是在[]
上添加匹配项:
getBoard (h:t) | isLOL h = h : getBoard t
| otherwise = []
getBoard [] = []
但是,与失败的后卫的比赛失败了,所以你可以把它写成
getBoard (h:t) | isLOL h = h : getBoard t
getBoard _ = []
现在,至于如何使用Prelude中的递归方案以更好的方式编写此函数:
isLOL
可以重写为
isLOL = all $ h -> 'a' <= h && h <= 'z' || 'A' <= h && h<= 'Z'
并且getBoard
可以类似地重写,请注意,如果每个字符都isLOL
,它将始终返回原始列表,否则返回空列表:
getBoard cs | all isLOL cs = cs
| otherwise = []