1

我必须编写一个函数来切换给定布尔值的列表,例如:

输入 :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。

4

1 回答 1

3

作为一种模式,[a]是一个单例列表:一个只包含一个元素的列表,a.

作为一种类型,[a]是一个a-type 值的列表。但不是作为一种模式。

该模式代表一个包含 head 元素和其余元素(a : as)的非空列表。将用作方程式中的模式:aas

-- toggle [a] = not a:[a]
toggle (a : as) = not a : _______ as
toggle [] = []

您需要通过填写空白来完成它,以使此定义递归。

当定义引用self以进行帮助调用以继续完成其输入的剩余部分的工作时,定义是递归的。

模式[](空列表)和(a : as)(非空列表)是互斥的。此外,它们一起是详尽的:列表值没有其他可能性。

但是模式[][a]一起并不是详尽无遗的:它们不涵盖两个元素或更长的列表的情况。该[a]模式与 相同(a : []),一个以空列表为尾部的列表。

于 2020-11-21T14:31:05.963 回答