【发布时间】:2016-02-16 12:12:19
【问题描述】:
我正在处理Programming in Haskell 并被问到以下问题:
判断一个列表中的所有逻辑值是否为真。
我在纸上画了一些东西,最后得到了:
listand :: [Bool] -> Bool
listand [] = True
listand (x:xs)
| x == False = False
| otherwise = listand xs
一直在想,好吧,我知道我正在正确地遍历列表,但是我如何跟踪 True 值(是的,我的思维方式可能太像功能世界中的命令式思维)。
无论如何,我运行了代码并且它是正确的。但是我从来没有告诉它当它找到一个真正的价值时如何表现。
所以我为 OR 做了同样的事情:
listor :: [Bool] -> Bool
listor [] = False
listor (x:xs)
| x == True = True
| otherwise = listor xs
果然这也有效。
现在我的问题是,为什么它会起作用?由于我从来没有告诉它在 listand 函数的情况下使用 True ,所以这究竟是如何工作的?是因为守卫条款吗?
【问题讨论】:
-
好吧,
otherwise的False是True,对吧? -
哦等等...空列表的定义在哪里?
-
这就是为什么您的草图将无法工作(并且永远不会产生
True) - 尝试使用[]或[True],...您是如何运行此代码以产生True? -
输入什么? (第一个版本甚至没有正确的语法,因为缺少
=- 所以你可能没有给我们你测试过的版本) -
好吧,我没有拥抱可以尝试这个,但这真的很令人惊讶 - 你确定你给了我们正确的版本吗?因为 i GHC(i) 它将产生“非详尽模式”异常 - 这是可以预料的......好吧