函数中的非穷举模式哈斯克尔



我想我错过了一个元素列表的情况,但我找不到编写它的方法,有人可以帮助我吗?

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 = []

相关内容

  • 没有找到相关文章

最新更新