Haskell中手动创建的length函数有什么问题?

8yoxcaq7  于 2023-04-30  发布在  其他
关注(0)|答案(2)|浏览(126)

我试图在Haskell中自己创建一个长度函数,但是当我试图用任何类型的列表执行它时,它说“非穷举模式”。
我尝试了“func [1] 0”,它应该递归调用“func”一次,然后返回y,因为它是“func [] y = y”。但是,它给我“非穷举模式”

func list y = func (tail list) (y+1)
func [] y = y
yxyvkwin

yxyvkwin1#

除了chi的正确答案之外,如果你使用模式匹配来提取列表的尾部,而不是简单地将名称list与第一个参数匹配,你不需要重新排序任何东西。

func (_:tail) y = func tail (y+1)
func [] y = y

(_:tail)模式指定了一个列表,该列表特别是 * 不 * 空,并将名称tail绑定到它的尾部。
虽然从个人观点来看,我发现如果先出现基本情况,至少会更容易理解递归函数。

pxyaymoc

pxyaymoc2#

把这两个方程的顺序颠倒一下。它们是按顺序尝试的,第一个匹配任何list,包括空列表,所以第二个方程永远不会被采用。
您应该始终打开警告。GHC警告了这个特定的错误,指出第二个等式永远不会被采用。
另外,如果使用GHCi,请确保将两个方程都写在。hs文件并将其转换为GHCi中的:load。如果你在GHCi提示符下一个接一个地输入两个方程,第二个方程将覆盖第一个方程(GHCi假设你想用新的定义重新定义函数)。

相关问题