首页
学习
活动
专区
工具
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.1K10

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

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

47410

从 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

50410

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

72450

一场函数式思维模式洗礼

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

45140

C++11互斥锁讲解

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

25110

Monad

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

1.3K50

“身首异处”序列(Swift)

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

66120

从素数生成看Haskell简洁性

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

31910

【翻译】Rust递归优化故事

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

1.9K20

各语言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。

1K20

谈谈单例模式

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

37230

当我们谈论Monad时候(二)

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

79610

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

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

1K51

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

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

62320

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个算法有很多重载版本,调用时候,你可以指定初始元素,也可以指定初始元素,同样,你可以指定执行策略,也可以指定执行策略.你甚至可以在指定二元运算情况下调用需要二元运算算法

1K20

UNIX(多线程):04---Mutex互斥量

C++11 定义了如下与互斥量和锁相关类: Mutex 系列类(四种),C++11 标准规定与互斥量相关类包括: std::mutex,最基本 Mutex 类,该类提供了最基本上锁和解锁操作...Lock 类(两种),C++11 标准定义了两种与互斥量相关 方式 std::lock_guard,方便线程对互斥量上锁。...adopt_lock_t adopt_lock {};,constexpr 是 C++11 新关键字) 通常作为参数传入给 unique_lock 或 lock_guard 构造函数。...defer_lock_t defer_lock {};) 通常作为参数传入给 unique_lock 或 lock_guard 构造函数。。...std::call_once,如果多个线程需要同时调用某个函数,call_once 可以保证多个线程对该函数调用一次。 unlock(), 解锁,释放对互斥量所有权。

80120
领券