首页 > 解决方案 > 为什么我的 Guard 不想在 Haskell 中调用递归函数

问题描述

我试图在我的 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)

它起作用了,我的第一句话和最后一句话正在改变。

所以如果有人知道这个问题,你可以留言。谢谢。

标签: functionhaskellcall

解决方案


基本上,我的问题是我的xs清单。我正在递归地阅读所有列表并删除元素。最后,我的列表没有元素,但我的功能仍在尝试删除和检查内容。所以,为了解决这个问题,我只是添加了一个简单的

compares [] b = b

推荐阅读