我必须编写一个函数来切换给定布尔值的列表,例如:
输入 :toggle [True,False,False]
输出:[False,True,True]
这就是我想出的
toggle :: [Bool] -> [Bool]
toggle [a] = not a:[a]
toggle [] = []
我不断收到此错误:
*** Exception: Uebung3.hs:38:1-20: Non-exhaustive patterns in function toggle
这是一个非常基本的问题,我来自Java,刚刚开始学习Haskell。
作为一种模式,[a]
是一个单例列表:一个只包含一个元素的列表,a
。
作为一种类型,[a]
是a
类型值的列表。但不是作为一种模式。
模式(a : as)
代表一个非空列表,其中 head 元素a
,其余元素as
。将其用作公式中的模式:
-- toggle [a] = not a:[a]
toggle (a : as) = not a : _______ as
toggle [] = []
您需要通过填写空白来完成它,以使此定义递归。
当定义引用self进行帮助程序调用以继续为其输入的剩余部分执行其工作时,定义是递归的。
模式[]
(空列表)和(a : as)
(非空列表)是互斥的。更重要的是,它们加在一起是详尽无遗的:列表值没有其他可能性。
但是[]
和[a]
在一起的模式并不详尽:它们不包括两个元素或更长元素列表的情况。[a]
模式与(a : [])
相同,一个以空列表为尾的列表。