haskell - 哈斯克尔 | 例外:函数 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
解决方案
您忘记为空列表实现一个子句。由于您执行递归,如果没有任何元素匹配,它最终将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
推荐阅读
- reactjs - 当我点击实际的img时,我怎样才能看到放大的图像
- arrays - ngFor中的Angular 7对象数组仅显示具有特定对象属性值的数据
- applescript - 终端退出而不执行操作
- javascript - 使用 Shiny 链接文件夹中的文件
- python - 如何解决猜谜游戏
- c - linux内核如何分离同一线程组中多个线程的用户空间堆栈?
- javascript - 将不同的值从数组传递到组件
- amazon-web-services - 授予 IAM 用户在 Python 中创建 lambda 部署包的策略是什么?
- c# - 如何使用 .NET SDK 客户端获取测试用例的共享步骤详细信息?
- javascript - 将函数结果存储到文本文件中