【问题标题】:Why my Guard doesn't want to call a recursive function in Haskell为什么我的 Guard 不想在 Haskell 中调用递归函数
【发布时间】: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 确实在编译时发现了问题。

标签: function haskell call


【解决方案1】:

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

compares [] b = b

【讨论】:

    猜你喜欢
    • 2011-10-31
    • 1970-01-01
    • 2016-02-04
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 2012-09-10
    相关资源
    最近更新 更多