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

基础语法_Haskell笔记1

一.简介 Haskell是一种纯函数式语言(purely functional programming language),其函数式特性纯度没有争议 命令式语言要求你提供求解步骤,Haskell则倾向于让你提供问题描述...即函数仅用来求值,没有副作用(不会影响外部状态),相同输入总能得到相同输出 惰性求值:真正需要值时候才现算,所以此时一连串计算(函数调用)只是作用于输入数据一系列变换公式,具体来看就是array.map...) 两个Bool字面量:True,False 相等性判断 ==:判断等于,可以用于字符串 /=:判断不等于(数学家语言,所以不等号长这样) 注意,类型必须严格一致才能比较,否则报错认为没有可比性(1...语法格式 Haskell函数调用默认是前缀语法,例如: succ 2 min 1 (-2) 与Bash脚本函数调用语法一样,函数名 参数1 参数2 但运算符作为特殊函数,默认要以中缀形式调用,...,要求左边是函数,右边是其参数 P.S.还有一个很有意思东西:($ 2) sqrt,中缀函数柯里化小把戏 柯里化 Haskell函数默认都是柯里化,都只接受一个参数: In Haskell, all

1.8K30
您找到你想要的搜索结果了吗?
是的
没有找到

应用----算术表达式计算问题(中缀转后缀,后缀计算)

应用----算术表达式计算问题(中缀转后缀,后缀计算) 问题引入:算术表达式计算是编译系统中一个基本问题,其实现方法是堆栈一个典型应用。任何一个算术表达式都是由操作数、运算符和分界符组成。...算术表达式计算分为两步: 中缀表达式转为后缀表达式 后缀表达式计算。...顺序读入中缀算术表达式,当读到单词为操作数时就将其输出,并接着读下一个单词。...//将字符型计算结果转为int型 return x; } int main() { int x; char data[stkSize]; printf("请输入要转换中缀表达式:"); scanf...3-4*5)测试) 可以看到,上述分析过程和结果都正确,其实熟悉编译原理同学可以直接用“移进”和“规约动作”实现中缀算数表达式到后缀算数表达式转换。

70120

C语言中缀表达式计算

本文将介绍中缀表达式计算详细写法,是C语言把中缀表达式转换为后缀表达式和C语言逆波兰计算结合     但本篇用了更精简写法,但是也相对提高了代码理解难度,在阅读时,需自己详细斟酌 开始...) 这里是另一种方式中缀表达式转后缀表达式,还有一种方式更容易理解一点,但是代码量相对更多,详情可见C语言把中缀表达式转换为后缀表达式 void convert2postfix(char *src,...同上还有另一种比较好理解方式 见C语言逆波兰计算器 float cal(char *src) { float stack[MAX_LEN]; float opd1, opd2; int top...stack[++top] = opd1 / opd2; break; } } p++; } return stack[top--]; } 主函数 输入中缀表达式作为一个字符串...,调用中缀表达式转换和后缀表达式计算便可以很容易得出结果。

1.2K10

热爱函数式你,句句纯正 Haskell【表达式篇】

---- theme: juejin 判断表达式 if..then..else 表达式是编程语言中最常用到基础之一,本片让我们来看看在 Haskell 中表达式是怎样?...实际上,if..then..else 是一种结构性表达式,也可以理解为一种运算符,属于:混合位置运算符; 而普通加法,处于两个参数中间,称为:中缀运算符; 函数,位于一个参数前面,可理解为:前缀运算符...; 函数式编程“输入 => 计算 => 得值”思想处处都有体现; switch 看了 if else ,再看看 switch 怎么写: Prelude> :{ Prelude| week n = case...(前缀、中缀、后缀、混合位置); 实际上,运算符共有 3 个属性: 优先级(在 Haskell 中,有十个优先级(0 ~ 9)); 结合性(分为左结合、右结合、无结合); 位置(前、中、后、混合)...、$ 等; 这些都是为后面揭开 Haskell 函数式编程神秘面纱基础,期间也能一窥这种把函数当计算奇妙之处,即使不能在开发生产中用到 Haskell,对于平常编程思考也是大有裨益,希望你有受用到

1.1K30

数据结构_栈应用_中缀式转后缀式并计算

3(12-1++)/5 计算结果就是17(一会儿可以用来验证程序结果是否正确 输入这个中缀数据是由字符组成中缀式本身就是一个string类型 如果用字符的话,单个数字或者符号,比如其中 ‘...==中 直到指针遍历完原中缀式为止 vector init(string s) //初始化给出原始中缀式,处理多位数以及自增自减(原来中缀式式一个字符串单个元素是一个字符,现在将它初始化为一个容器...,返回它就可以 3.中缀式转后缀式 用一个string指针遍历中缀式 建立一个字符串数组save,用来存储后缀式元素 建立一个操作符栈result(string类),用来调整操作符顺序 规则: 如果元素是数字...ab进栈之后就变成了ba,应该用a-b,而不是b-a 如果操作符是一元运算符,就直接取栈顶元素,计算之后返回result int stringToInt(string s) //将操作数字符串转变成int...(v1);//中缀式转后缀式 cout << "转化为后缀式并进行计算计算结果是:" << calculate(v2) << endl; } 6.思维导图 中缀式转后缀式.pdf 7.结束 That

48850

计算器:中缀表达式转后缀表达式

这几天想写一个Android计算器,所以先写好中缀表达式到后缀表达式计算。...例如:中缀表达式(8+9*10)-4/2+3 我们可以进行如下操作: 1、将每个操作符对应两个操作数用括号括上(((8+(9*10))-(4/2))+3) 2、将操作符移到对应括号外(((8(...910*)+)(42)/)-3)+ 3、去掉括号即可  8910*+42/-3+ 是不是很简单,这样我们就讲一个中缀表达式转换成论文后缀表达式。...那么计算机中是怎样进行呢?...转换整体流程如下: 中缀表达式转后缀表达式方法: 1.遇到操作数:直接输出(添加到后缀表达式中) 2.栈为空时,遇到运算符,直接入栈 3.遇到左括号:将其入栈 4.遇到右括号:执行出栈操作

2.1K10

用栈来实现简易版中缀表达式计算

1.什么是栈 先进后出,元素删除和插入只能在同一端一种线性表 2.栈实现方式 数组和链表都可以,本次使用数组 3.什么是中缀表达式 3+2-1*6+10 4.代码: /** * @author...shengjk1 * @date 2020/2/13 */ public class Calcaulator { public static void main(String[] args) { // 中缀表达式...operStack.isEmpty()) { //如果当前操作符优先级小于等于栈中符号优先级,就需要从数栈中 pop 两个数 //在从符号栈中 pop 出一个符号,进行运算,...boolean isOper(char val) { return val == '+' || val == '-' || val == '*' || val == '/'; } /** * 计算...: 1.递归 2.方法调用 3.表达式转化和求值 4.二叉树遍历 5.图深度优先遍历 6.逆序输出 如 单链表反转

42420

铁定不纯IO_Haskell笔记5

写在前面 一直有个疑惑,Haskell号称纯函数式语言,那么铁定不纯场景(肯定有副作用,或者操作本身就是副作用)如何解决?...Haskell做法其实类似于ReactcomponentDidMount()等组件生命周期函数,React建议(道德约束)保持render()是纯函数,带有副作用操作挪到componentDidMount...Haskell提供了do语句块,也是用来隔离不纯部分 一.I/O action 先看个函数类型: > :t print print :: Show a => a -> IO () print函数接受一个...但如果编译执行该函数,会发现是逐行处理: $ ./toUpperCase abc ABC efd EFD 这与输入缓冲区有关,具体见Haskell: How getContents works?...惰性I/O 字符串本身是一个惰性List,getContents也是惰性I/O,不会一次性读入内容放到内存中 toUpperCase'示例中会一行一行读入再输出大写版本,因为只在输出时候才真正需要这些输入数据

1.3K30

当我们谈论Monad时候(二)

不过由于列表可以是任意长,因此需要定义一个链状结构 data List a = Nil | Cons a (List a) infixr 5 `Cons` 在Haskell中,用`包裹函数可以作为中缀函数使用...Haskell中全符号、被小括号包裹函数默认是中缀,比如这个函数调用就是中缀形式f xs。接受一个容器内函数和值,并将运算之后结果重新放在容器中。...”,或者“之前计算结果无法影响之后计算”。...,它没有执行计算“上下文”。...而Monad计算流程是可变,这也意味着它计算有“上下文”。一般计算场景中都是有上下文,比如IO运算。但是这种没有依赖计算场景其实也是存在,比如并发、Parser。

77810

Python——中缀到后缀转换(Sta

prec["-"] = 2     prec["("] = 1     # 实例化     opstack = Stack()     postfixList = []          # 把输入字符串分割开...    tokenList = infixexpr.split()     for token in tokenList:         # 这里用到是string模块中两个方法,源代码都是手敲字母和数字...1、传入参数,这里用复杂一点 ? 2、 实例化、创建最终生成后缀样式 列表、将传入字符串分隔开 ?...5、传入“ + ”,进入while循环 --> opstack不是空(还记得第一步是传入“(”吗) --> 进行对应prec对应值比较(也就是优先级比较) --> 不满足条件循环结束 --> ...19、传入“ + ”,进入while循环 --> opstack不是空(还记得之前传入“(”和“ * ”吗) --> 进行对应prec对应值比较(也就是优先级比较) --> 不满足条件循环结束

1.6K20

中缀表达式转后缀表达式栈变化_利用栈实现中缀转后缀

这里给出中缀表达式转后缀表达式算法过程,以及再举两个例子 算法过程: 1....true : false); } // 优先级比较 bool check(char ch1, char ch2) // 只有ch1优先级小于ch2优先级时返回true { if((ch1 ==...StackIsEmpty(s)){ // 栈内有剩余运算符则加入表达式 ans[idx++] = GetTop(s); StackPop(s); } ans[idx] = '\0'; // 确保ans为字符串不会有多余内容...StackIsEmpty(s)){ // 栈内有剩余运算符则加入表达式 ans[idx++] = GetTop(s); StackPop(s); } ans[idx] = '\0'; // 确保ans为字符串不会有多余内容...ans[MaxSize] = {0}; scanf("%s", str); solve(s, str, ans); printf("%s\n", ans); return 0; }'; // 确保ans为字符串不会有多余内容

44330

从素数生成看Haskell简洁性

最近有空就在看Haskell,真是越看越觉得这个语言有意思。在知乎(原回答@阅千人而惜知己)找到了一份很有意思求素数代码,非常简洁,我觉得很能体现这个语言特点。...然后筛选出不能被p整除剩余数字,递归求解。这里提及一下,[2..]是Haskell列表一个神奇特性,即支持无限列表。这个Haskelllazy特性有很大关系。...yield n it = filter(_not_divisible(n), it) # 构造新序列 看来看去,似乎Haskell版本真的很简单舒服。...这段代码也是Haskell简洁性高度体现。其中,tail想到与后移整个数列,之后通过zipWith函数处理将两个数列相加,以此来达到F(n)=F(n-1)+F(n-2)效果。...虽然说这样高度精简代码由于不直观,并不太适合在实际项目中使用,况且其他语言稍长代码甚至可能在效率上更优,但这仍不影响Haskell表现其独有的简洁及优雅魅力。

29910

应用中缀表达式转换为后缀表达式后缀表达式计算

中缀表达式转换为后缀表达式 后缀表达式 做数学运算时,经常使用中缀表达式,即“操作数 运算符 操作数”。在计算机处理时候更习惯后缀表达式,即“操作数 操作数 运算符”。...例如a + b * c转换为后缀表达式a b c * +,使用栈可以将中缀表达式转换为后缀表达式,具体方法为: 扫描到数字直接输出 扫描到运算符则与栈顶比较,若扫描到运算符优先级低于或等于栈顶运算符优先级...,则弹栈直到栈空或栈顶运算符优先级低于扫描到运算符,之后运算符入栈;否则直接入栈。...base_stack.New_link_stack() topost := To_postfix{} topost.data_stack = link return &topost } 后缀表达式计算...计算方法 后缀表达式计算比较简单,顺序扫描整个后缀表达式: 若遇到数字,直接入栈 若遇到运算符,弹栈两次取出两个数字,按运算符运算,将结果再次入栈 这样扫描完整个后缀表达式之后,栈中就应该只有一个数

1.4K70

热爱函数式你,句句纯正 Haskell【函数篇】

函数本质 Haskell 里变量值在绑定后不会改变,所有变量一定意义上可以理解为定值。 无论如何,定义过值是没法再改变。...Haskell 值与函数是统一,函数只是需要其他参数输入值。如果定义是函数,那么这个函数行为在运行过程中也是不会改变,对于某一个特定输入返回结果总是确定,这样函数为纯函数。...有人觉得不改内存状态想法听上去很荒诞,甚至觉得这样是没有办法做计算。其实,这两种想法都是错误。不改变内存状态自有道理,而其它编程语言可以完成工作,Haskell 一样可以完成。...再三强调,在 Haskell 中,函数与值没有本质区别,它可以是单一定值,也可以是任意两个函数间映射; 实际上,在 Haskell 世界里,所有的运算符号都可以被看做是函数,如加号 + 是一个需要两个参数函数...λ表达式 Haskell 还有另外一种书写函数格式,即 λ 表达式; // 定义方式 3 函数名= (\参数1 -> \参数2 -> ...

32610

应用中缀转后缀表达式

后缀表达式,由波兰科学家在20世纪50年代提出,将运算符放在数字后面,更便于计算机去计算,而我们平常看到 1 + 2、5 * 10 等,都是中缀表达式,这种方式,符合人类思考方式。...举几个例子: 5 + 4 => 5 4 + 1 + 2 * 3 => 1 2 3 * + 8 + ( 3 – 1 ) * 5 => 8 3 1 – 5 * + 左侧为中缀表达式,右侧为后缀表达式。...那这种转换规则和方法是什么呢?...默认栈顶若是左括号,左括号优先级最低) 若栈顶符号优先级不低:将栈顶符号弹出并输出,之后进栈 右括号:将栈顶符号弹出并输出,直到匹配左括号 【使用栈模型实现以上功能】 注意,以下代码需要用到栈模型链式储存实现头文件...((char)(int)LinkStack_Top(stack))) { // 弹出并输出栈顶内容 output((char)(int)LinkStack_Pop(stack)); } // 此时弹出一定是左括号

15420
领券