首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我的Guard不想在Haskell中调用递归函数

在Haskell中,递归函数的调用需要满足一些特定的条件。如果你的Guard不想在Haskell中调用递归函数,可能是由于以下几个原因:

  1. 语法错误:请确保你在Guard中正确地使用了递归函数的语法。在Haskell中,递归函数的定义需要使用关键字"where"或"let",并且递归调用需要使用函数名本身。
  2. 递归终止条件:递归函数必须包含一个终止条件,以避免无限递归。请检查你的递归函数是否包含了适当的终止条件,例如基本情况或边界情况。
  3. 函数类型不匹配:递归函数的参数类型和返回类型必须与函数定义中的类型声明匹配。请确保你的递归函数的参数类型和返回类型正确。
  4. Guard条件不满足:Guard是一种用于在Haskell中进行条件判断的语法结构。如果Guard条件不满足,递归函数可能不会被调用。请检查你的Guard条件是否正确,并确保在适当的情况下调用递归函数。

总结起来,如果你的Guard不想在Haskell中调用递归函数,可能是由于语法错误、缺乏递归终止条件、函数类型不匹配或Guard条件不满足等原因。请仔细检查你的代码,并确保以上条件得到满足。如果问题仍然存在,请提供更多的代码和错误信息,以便更好地帮助你解决问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

基础语法_Haskell笔记1

Haskell的特点: 变量不可变:函数式里的变量与常量概念一样,源自数学思维,令x=1,那么x永远都是1 引用透明:函数调用能被直接替换成相应的值,而不会影响函数的行为。...语法格式 Haskell里的函数调用默认是前缀语法,例如: succ 2 min 1 (-2) 与Bash脚本的函数调用语法一样,函数名 参数1 参数2 但运算符作为特殊的函数,默认要以中缀形式调用,...因为haskell自带currying,所以等价于 -- addThree x y z = x + y + z P.S.匿名函数中的->与类型声明中的->语义相同,都表示“映射到”(maps to) 函数组合...调用函数时会按声明顺序匹配参数类型,所以上面的sayOneTwoThree 2只会返回"Not between 1 and 3" 再比如利用模式匹配递归求阶乘: fact 0 = 1 fact n =....单行形式也是合法的(但可读性差,不建议用),例如: isPositive n | n > 0 = True | otherwise = False where关键字 where关键字跟在guard后面

1.9K30
  • 创建子类对象时,父类构造函数中调用被子类重写的方法为什么调用的是子类的方法?

    public static void main(String[] args) { A a = new A(); B b = new B(); } } 问题:为什么创建...A对象的时候父类会调用子类方法?...但是:创建B对象父类会调用父类的方法? 答案: 当子类被加载到内存方法区后,会继续加载父类到内存中。...当子类对象创建时,会先行调用父类的构造方法(构造方法也是方法),虚拟机会在子类方法区寻找该方法并运行。 但是:由于java语言是静态多分派,动态单分派。...其结果是当编译的时候,父类构造方法调用的方法的参数已经强制转换为符合父类方法的参数了。 上边代码在编译前已经转换为下面这个样子的了。

    6.2K10

    从 Java 和 JavaScript 来学习 Haskell 和 Groovy(DSL)

    比如 Categories,这个,我在前面一篇 《元编程》中已经介绍过了。 最后来说 Haskell。...前文已经介绍过了高阶函数的使用,但是在 Haskell 中,所有的函数都可以理解为,每次调用最多都只接受一个参数,如果有多个参数怎么办?...把它化简为多次调用的嵌套,而非最后一次调用,都可视为高阶函数(返回函数的函数)。...如果递归函数的递归调用自己只发生在最后一步,并且程序可以把这一步的入栈操作给优化掉,也就是最终可以使用常量栈空间的,那么就可以说这个程序/语言是支持尾递归的。 它有什么好处?...因为对于常规语言,如果面临递归工作栈过深的问题,可以优化为循环解决问题;但是在 Haskell 中,是没有循环语法的,这就意味着必须用尾递归来解决这个本来得用循环才能解决的问题。

    49310

    从 Java 和 JavaScript 来学习 Haskell 和 Groovy(汇总)

    纵览编程范型之后,再来回顾一下之前几篇的内容,欢迎移步阅读: 《从 Java 和 JavaScript 来学习 Haskell 和 Groovy(引子)》,记载了写这一系列文字的初衷,以及为什么选这几门语言...《从 Java 和 JavaScript 来学习 Haskell 和 Groovy(DSL)》,介绍了这几门语言对于 DSL 实现的常见模式和语法糖,比如 Java 的链式调用和泛型传递,闭包和 Lambda...表达式,JavaScript 的高阶函数,Groovy 对于 DSL 友好的语法糖,Haskell 的模式匹配和 List Comprehension,尾递归和惰性求值等等。...很多特性都没有涉及,比如 Haskell 的很多高级特性,是因为我觉得我没法写好,就先不写了。...工作需要,要开始学习 Scala 了,我本来对 Scala 的认识水平仅仅停留在 “了解” 的基础之上,通过最近这段时间的学习,我发现有了 Groovy 和 Haskell 的基础以后,再来看 Scala

    51910

    Monad_Haskell笔记10

    P.S.关于computation context的详细信息,见Functor与Applicative_Haskell笔记7 用来解决context相关计算中的另一个场景:怎样把一个具有context的函数应用到具有...普通函数 + 普通值:函数调用 函数输入输出类型不一致的情况 函数输入普通值,输出context里的值 + context里的值:Monad 函数输入普通值,输出context里的值 + 普通值:直接调用...函数输入context里的值,输出普通值 + context里的值:直接调用 函数输入context里的值,输出普通值 + 普通值:用pure包一下再调 所以,就这个场景(把是否处于context里的函数应用到是否处于...Just (show x ++ y) 类比不涉及context的普通计算: let x = 3; y = "!"...: > [1..50] >>= \x -> guard ('7' `elem` show x) >> return x [7,17,27,37,47] 其中guard函数如下: guard

    74150

    一场函数式思维模式的洗礼

    写在前面 以下语境都是Haskell,没有循环结构,只能用递归来写作业 一.递归 先从一个简单的递归问题感受下函数式语言的语法魅力 求数组中的最大元素,可以这样做: -- if-else maximum...递归是唯一的出路 简单场景 先考虑一个简单的问题,如何实现length函数?...函数,似乎挨个数一遍更符合思维习惯,此时就需要给出其递归定义,进而得出递归算法 P.S.也有不留出口的死递归,例如repeat函数: repeat' :: t -> [t] repeat' x = x...i] ++ (drop (j + 1) xs) 上面这个函数说,一条线被2个点分成3段,List中两个元素交换的结果就是第一段并上第二个点,并上中间那段,再并上第一个点和最后一段 当然,这个问题与递归没什么关系...重新审视上面这两种思维模式的差异: 命令式:我跟你讲啊,弄两个指针,分别从左右两端逼近,这样做就能找出划分点,再对划分后的子集分别排序 函数式:排序就是把集合从轴一分为二,再对左右两边分别排序。

    45740

    C++11中的互斥锁讲解

    注意:尽管如此,下面会指出,由于 va_args 的使用等原因,这个容器并非真正线程安全。此外,dump() 方法不应属于容器,在实际实现中它应该作为一个独立的辅助函数。...这是因为,seed 是线程局部量,调用 srand() 只会在主线程中初始化 seed,在其他工作线程中 seed 并未被初始化,所以每次得到的数字都是一样的。...unique_lock:通用 mutex 封装类,与 lock_guard 不同,还支持延迟锁、计时锁、递归锁、移交锁的持有权,以及使用条件变量。不允许拷贝,但允许转移(move)。..._lock.unlock();}假如这个函数在两个线程中被调用,在其中一个线程中,一个元素被移出容器 1 而加到容器 2;在另一个线程中,它被移出容器 2 而加到容器 1。...小心使用递归锁:std::recursive_mutex允许同一个线程多次获得锁,并在最后一次解除锁定。但是,在实际应用中,这种机制可能会导致死锁问题和性能瓶颈等问题,因此必须谨慎地使用。

    32310

    Monad

    澄清了函子的含义,那么如何在程序中表达它? 在Haskell中,函子是在其上可以map over的东西。稍微有一点函数式编程经验,一定会想到数组(Array)或者列表(List),确实如此。...Identity自函子范畴 图中表示的是一个将范畴映射到自身的自函子,而且还是一个特殊的Identity自函子。为什么这么说?...假设我们有个cube函数,它的功能就是计算每个数的3次方,函数签名如下: cube :: Number -> Number 现在我们想在其返回值上添加一些调试信息,所以返回一个元组(Tuple),第二个元素代表调试信息...对于函数而言,结合律就是将函数以各种结合方式嵌套起来调用。我们将常用的compose函数看作此处的二元运算。...,右边的f运算的结果是元组,而左侧的f却是接收一个Number类型的函数,它们是彼此不兼容的。

    1.3K50

    从素数生成看Haskell的简洁性

    最近有空就在看Haskell,真是越看越觉得这个语言有意思。在知乎(原回答@阅千人而惜知己的)找到了一份很有意思的求素数代码,非常简洁,我觉得很能体现这个语言的特点。...核心函数就是sieve,大致处理过程是这样:读入一个列表,并取出第一个元素p。然后筛选出不能被p整除的剩余数字,递归求解。这里提及一下,[2..]是Haskell列表的一个神奇的特性,即支持无限列表。...那么,如果是放在同样具有列表解析的Python中,又能怎么写呢?...这段代码也是Haskell简洁性的高度体现。其中,tail想到与后移整个数列,之后通过zipWith函数的处理将两个数列相加,以此来达到F(n)=F(n-1)+F(n-2)的效果。...虽然说这样高度精简的代码由于不直观,并不太适合在实际的项目中使用,况且其他语言的稍长的代码甚至可能在效率上更优,但这仍不影响Haskell表现其独有的简洁及优雅的魅力。

    33710

    “身首异处”的序列(Swift)

    我以multiResult为例稍微讲解一下这个函数的过程。这个函数的重点当然是递归,事实上我认为递归可以说是函数式编程这种范式的核心之一。...至此向下递归结束,接下来就是延递归栈往上计算各个function函数(此例中即乘法)的值。最终得到1 * 5 * 3 * 2 = 30。...有一种常见的优化方式是尾递归(简单来说,即把递归调用放到函数最后),如果编译器支持尾递归优化的话,就会把函数中的一些中间变量舍去甚至直接优化成循环形式。...,哪怕不是为了尾递归优化,我也推荐大家使用guard语句处理边界条件然后提前返回,这也是所谓的防御式编程中所提倡的,我之前的一篇文章也有提到。...函数的大致过程为:递归进行分解排序,最后延递归栈向上连接数组。之前我写过一篇快排的文章,里面的函数远没有上面这个版本简洁优雅。 快把decompose加入你的Code Snippet中吧^ ^。

    67220

    【翻译】Rust中的尾递归优化的故事

    诸如Haskell和Lisp家族这类函数式语言,以及逻辑语言(Prolog可能是最著名的例子)都强调采用递归的方式思考问题。这些语言通过尾调用优化可以在性能上获得许多好处。...注意: 我不会在这篇文章里解释尾调用的概念。下面是一些比较好的相关资料: Youtube频道 Computerphile[1] 有一个视频[2],详细讲解了尾递归函数的示例。...有了上面这些知识,让我们回来看看,为什么Rust没有做TCO。 回顾Rust的时光机 我能找到的最早关于Rust中尾调用优化的相关资料,可以追溯到Rust项目的开始阶段。...我发现了来自2013年的这些邮件列表[6],在这些邮件列表中,Graydon Hoare详细列出了关于为什么他认为尾调用优化不属于Rust的观点。 ?...当时问题的核心似乎是由于LLVM的不兼容;说实话,他们讨论的很多东西我都无法理解。

    2K20

    各语言Y组合子大比拼

    另外,由于递归函数实际参数是传至右式的,所以左式并不需要传args。 JavaScript魔法 大部分如lua、php和Python并没有太大的区别。...Y = f => (x => f(x(x))) ((x => f(...a => x(x)(...a)))) 由于无法脱离“函数调用要加括号”的苦海,于是纵使有简单的lambda写法,JS里成山的括号依旧令人无法直视...CoffeeScript黑魔法 熟悉我的人一定知道,我个人是cs的脑残粉。cs的简洁与灵活和js(尤其是es5)真是天壤之别,函数调用可以省略括号也提供了极大的便利。...Haskell 那支持柯里化的语言是不是就无敌了?少年,天真了。...有严格的类型检查,于是Y组合子这种“无限递归类型”的函数是无法通过类型检查的。

    1.1K10

    来看看几种 Monad来看看几种 Monad

    如果我们拿到一个 Just,就把包在 Just 里面的值喂给函数。如果我们拿到一个 Nothing,我们就说结果是 Nothing。 我们调用 applyMaybe 而不调用 >>=。...do 表示法 Monad 在 Haskell 中是十分重要的,所以我们还特别为了操作他设置了特别的语法:do 表示法。...毕竟在 let 表达式的情况下并没有失败就跳下一个的设计。至于在 do 表示法中模式匹配失败的话,那就会调用 fail 函数。他定义在 Monad 的 type class 定义猪。...用 return 来把一个值放进缺省的 context 然后用 >>= 喂给一个函数其实跟函数调用是同样的,只是用不同的写法而已。...因为把这个值放进 context 中然后丢给函数,应该要跟直接把这个值丢给函数做调用应该没有差别。 对于 Maybe monad,return 被定义成 Just。

    1.1K20

    谈谈单例模式

    单例释放的时机 接下来查看,那么单例模式应该何时释放其资源呢?一般情况下当进程退出的时候,一般的资源也都会随之释放,大多数场景单例模式即使不手动去调用析构函数也不会带来很大的问题。...但是有一些场景想在进程退出前把资源处理完善,比如这个单例对象有内存中的内容需要刷新到磁盘。...那么有两种方法,一种是全局static对象由进程退出的时候调用析构函数,另一种是让单例使用者自己进行析构函数调用。...,将会调用SingletonConfig的析构函数,看下汇编,可以看到利用atexit注册了一个方法,这个方法中会调用SingletonConfig的析构函数,并且在程序退出的时候执行。...总结 单例模式除了其具有程序中单个实例化对象的特点,也具有防御式编程的思想在其中。使用中一定要注意单例模式的生命周期,以及模板实现的跨模块调用的问题。以上仅是一家之言,欢迎一起讨论。

    38030

    函数式编程很难,这正是你要学习它的原因

    它给你的初次印象不友善   我7岁时就开始编程,在漫长无聊的郊区夏季里,在我祖父的计算机上瞎搞一气。我学了BASIC,用它在屏幕上画一个蹦跳的球。...即使不算这些该死的指针,我写、读、学习、练习中,同样遭遇无数的失败。我把祖父的硬盘给毁掉了两次(一次属意外),最后弄得不少次要自己重装操作系统。我失败,一遍遍的失败。   ...大多数人,包括我,则需要不断的练习和参考例子来理解什么是指针、为什么它们很重要。   这种艰难的努力过程不是偶然的,是一种几乎普遍的现象。指针是一种非常强大和基础功能的概念。...对我而言,我已经不惊奇于由于这样的思维而阻止他们学习函数式语言的现象;他们需要学习一种跟指针和递归一样基础的新概念。他们需要有一种只有专业人员在完成清晰的商业目标时才具有的耐心和斗志。...没有一个清晰的指导(比如由一个实用主义的作者写的一本好书),本来已经很困难的学习任务变的更加可怕。   这些叠加起来的复杂因素导致了不出意外的结果:很多人不情愿在函数式编程学习中投入时间。

    1.1K51

    当我们谈论Monad的时候(二)

    Welcome to Haskell 在上一篇文章中,我通过几个Java的例子简单的说明了Monad的本质和一些工程中常见的用途。接下来的文章就不再侧重于工程了,而是要慢慢向理论转换。...而作为过渡,我选择了Haskell来代替Java进行说明。本篇文章默认读者已经对Haskell的基本语法有所了解,因此对此类内容我不会再做赘述。...Applicative是对“应用”的抽象,它允许在容器中“存放”一个函数。 还是用例子来说明。上一篇文章的最后,我举了一个多参函数的例子。当时我们封装了一个函数liftM2用来处理2参数的函数。...Haskell中全符号的、被小括号包裹的函数默认是中缀的,比如这个函数的调用就是中缀形式f xs。接受一个容器内的函数和值,并将运算之后的结果重新放在容器中。...Haskell中的IO函数都会返回一个IO Monad,而上面的代码中,我们并没有对每一条都使用之前的结果。对于部分IO Monad(如putStrLn返回的),我们直接就抛弃了这些返回值。

    81310

    听君一席话,如听一席话,解释解释“惰性求值”~

    这,就,是, —— 惰性求值的思想体现(不需要立即返回的值,就先别计算;) 庐山面目 来看下 wiki 释义: 惰性求值又叫惰性计算、懒惰求值,也称为传需求调用,是一个计算机编程中的一个概念,目的是要...第一节示例的 JavaScript 的代码虽然是有惰性求值的思想体现,但是其本身并不是惰性求值; 惰性求值是编程语言的特性设计,很多纯粹的函数式编程语言都支持这种设计; 比如在 Haskell 中实现上述示例...有点像 Promise 的意思,你不告诉我 resolve/reject,我就 pending;Haskell 中,你不告诉我什么时候调用这个值,我就维持 thunk 的状态; 无限列表 在 Haskell...不断递增的数组; 为什么在 Haskell 中行,在 JavaScript 中不行?...因为它是懒惰的,你定义归你定义,反正定义的时候,我又不用分配无穷大的内存,等你开始调用的时候,我再开始计算分配吧! 延迟计算很棒,不过事物都有两面性,这样做坏处是什么?

    66120

    C++17,标准库新引入的并行算法

    .为了理解方便,我先介绍一下 Haskell 中相关的内容,之后再回到C++的讲解中....函数(\a -> a * a).(4) 和 (5) 则更加复杂些:(4) 中我将整数列表中的所有整数对相乘(乘法单位元素1作为初始元素).(5) 中则做了所有整数对相加的操作.(6), (7), 和...第一个函数将列表中的元素映射为元素的长度,第二个函数则将这些映射的长度相加.(9) 中的操作和 (7) 很相似,不同之处在于 foldl 只产生一个数值(而不是列表)并且需要一个初始元素(我指定初始元素为...我想你也许好奇为什么我要在介绍C++的文章中写这么多 Haskell 的内容(这些内容还颇具挑战性),那是因为两个原因: 你可以知道 C++ 中相应算法的历史 比照 Haskell 的对应方法可以帮助我们理解...Final remarks C++17 新引入的这7个算法有很多重载版本,调用的时候,你可以指定初始元素,也可以不指定初始元素,同样的,你可以指定执行策略,也可以不指定执行策略.你甚至可以在不指定二元运算的情况下调用需要二元运算的算法

    1.1K20

    一个函数的自白

    我的高阶与递归有啥区别? 我的回调和匿名是一回事么? 对象中的方法是我么? 控制对象的行为方式有哪些呢? 为什么说类型错误只是异常处理的一种方式? 面对数据密集型应用和并发场景,我有何作用?...一般地,在编程世界中,归纳法用递归函数表示。递归函数就是自己调用自己,一直在栈中操作,如果递归层次过深的话,会导致栈溢出问题的出现。 在许多编程语言中,尾递归优化解决了递归调用中的栈溢出问题。...尾递归即在函数尾部发生的递归调用,尾递归发生时,程序语言的处理器可以安全地删除先前的栈记录,因为该调用返回时栈中不需要继续其他操作,这就是尾递归优化,尾递归优化有效地将递归函数转为迭代,节省了时间和内存...需要注意的是,python中并不对尾递归进行优化,一般要对调用深度进行限制。 下一个是我的自动调用——回调和匿名 忽如一夜春风来,千树万树梨花开。...类型不匹配是指我得到的值类型与所期待的值类型不符;或者一个伙伴返回了一个特定类型的值,但该值稍后被调用者当作其他类型的值使用。

    77250
    领券