首页 > 解决方案 > 哈斯克尔 | 例外:函数 myAny 中的非详尽模式

问题描述

我刚刚开始学习haskell,并为任何功能编写了自定义代码。请提出为什么即使在我使用其他方式或哪里出错之后它仍然显示非详尽模式错误?

引发异常:- 异常:main.hs:(37,1)-(40,21):函数 myAny 中的非详尽模式

myAny :: (a -> Bool) -> [a] -> Bool
myAny f (x:xs)
  | f x == True = True
  | f x == False = myAny f xs
  | otherwise = False

标签: haskell

解决方案


您忘记为空列表实现一个子句。由于您执行递归,如果没有任何元素匹配,它最终将myAny使用空列表调用。在这种情况下,您需要返回False

myAny :: (a -> Bool) -> [a] -> Bool
myAny _ [] = False
myAny f (x:xs)
  | f x == True = True
  | f x == False = myAny f xs
  | otherwise = False

但是请注意,使用 执行两次检查是没有意义的f x,如果不是True,则它是False,因此这种otherwise情况通常永远不会发生:

myAny :: (a -> Bool) -> [a] -> Bool
myAny _ [] = False
myAny f (x:xs)
  | f x = True
  | otherwise = myAny f xs

我们可以进一步简化(||) :: Bool -> Bool -> Bool为:

myAny :: (a -> Bool) -> [a] -> Bool
myAny _ [] = False
myAny f (x:xs) = f x || myAny f xs

或使用foldr模式:

myAny :: Foldable f => (a -> Bool) -> f a -> Bool
myAny f = foldr ((||) . f) False

推荐阅读