我试图在Haskell中自己创建一个长度函数,但是当我试图用任何类型的列表执行它时,它说“非穷举模式”。我尝试了“func [1] 0”,它应该递归调用“func”一次,然后返回y,因为它是“func [] y = y”。但是,它给我“非穷举模式”
func list y = func (tail list) (y+1) func [] y = y
yxyvkwin1#
除了chi的正确答案之外,如果你使用模式匹配来提取列表的尾部,而不是简单地将名称list与第一个参数匹配,你不需要重新排序任何东西。
list
func (_:tail) y = func tail (y+1) func [] y = y
(_:tail)模式指定了一个列表,该列表特别是 * 不 * 空,并将名称tail绑定到它的尾部。虽然从个人观点来看,我发现如果先出现基本情况,至少会更容易理解递归函数。
(_:tail)
tail
pxyaymoc2#
把这两个方程的顺序颠倒一下。它们是按顺序尝试的,第一个匹配任何list,包括空列表,所以第二个方程永远不会被采用。您应该始终打开警告。GHC警告了这个特定的错误,指出第二个等式永远不会被采用。另外,如果使用GHCi,请确保将两个方程都写在。hs文件并将其转换为GHCi中的:load。如果你在GHCi提示符下一个接一个地输入两个方程,第二个方程将覆盖第一个方程(GHCi假设你想用新的定义重新定义函数)。
:load
2条答案
按热度按时间yxyvkwin1#
除了chi的正确答案之外,如果你使用模式匹配来提取列表的尾部,而不是简单地将名称
list
与第一个参数匹配,你不需要重新排序任何东西。(_:tail)
模式指定了一个列表,该列表特别是 * 不 * 空,并将名称tail
绑定到它的尾部。虽然从个人观点来看,我发现如果先出现基本情况,至少会更容易理解递归函数。
pxyaymoc2#
把这两个方程的顺序颠倒一下。它们是按顺序尝试的,第一个匹配任何
list
,包括空列表,所以第二个方程永远不会被采用。您应该始终打开警告。GHC警告了这个特定的错误,指出第二个等式永远不会被采用。
另外,如果使用GHCi,请确保将两个方程都写在。hs文件并将其转换为GHCi中的
:load
。如果你在GHCi提示符下一个接一个地输入两个方程,第二个方程将覆盖第一个方程(GHCi假设你想用新的定义重新定义函数)。