【发布时间】:2020-01-10 04:09:15
【问题描述】:
我试图在我的 Haskell 程序中调用递归。每次列表中的元素与单词匹配时,我都想调用我的函数。
我的代码正在编译没有问题,但是当我试图执行他时,我有这个错误
haskell: haskell.hs:(27,1)-(30,33): Non-exhaustive patterns in function detect
问题出在我的函数:
detect :: [[Char]] -> [[Char]] -> [[Char]]
detect (x:xs) b
| x == "now" || x == "go" = detect xs (SwapP 0 1 b)
| x == "stop" = detect xs (SwapP 0 (length b - 1) b)
detect (x:xs) b = detect xs b
在 x:xs 中有我的单词列表,在我的 b 中,我有一个函数,负责改变单词的位置。
但是守卫中的递归不起作用。
我的问题中最奇怪的事情是当我尝试做同样的事情但在我的警卫之外,它正在工作,如果我在做的话
detect :: [[Char]] -> [[Char]] -> [[Char]]
detect (x:xs) b = detect xs (SwapP 0 (length b - 1) b)
它正在工作,我的第一句话和最后一句话正在改变。
所以如果有人知道这个问题,你可以留言。谢谢。
【问题讨论】:
-
问题在于你的函数
compares,而不是detect。话虽如此,您的detect函数确实不覆盖空列表[]。 -
@NatkoUndoshy 一个列表要么是一个空列表,要么由一个附加到另一个列表的元素组成。这是一个递归定义,所以即使是一个非空的有限列表也必须包含一系列附加在空列表上的元素。您应该在线查看一些资源,了解 Haskell 中的 ADT 如何工作以及如何使用模式匹配来定义递归函数,这将有助于澄清
detect (x:xs) b = detect xs b的问题。 -
想一想递归会如何结束,最终
xs将是没有处理的空列表。 -
你可以回答你自己的问题。
-
总是在编译时打开警告。 GHC 确实在编译时发现了问题。