
Haskell
文章平均质量分 60
Haskell 程序设计
许野平
非常喜欢软件设计这份工作,有不错的数学基础,喜欢读书、摄影与音乐。
展开
-
Haskell:面向对象OOP的实现
Haskell 作为一种纯函数式编程语言,并不直接支持传统面向对象编程(OOP)中的类、继承、多态等概念。然而,Haskell 的强大类型系统和一些高级特性允许开发者以函数式的方式模拟 OOP 的某些方面。原创 2024-08-05 12:25:17 · 496 阅读 · 0 评论 -
Haskell:匿名函数及简单的示例
在 Haskell 中,匿名函数是通过 lambda 表达式来定义的。Lambda 表达式的基本形式是,其中parameters是函数的参数列表(可以是一个或多个参数,也可以没有参数),expression是函数体,它使用这些参数进行计算并返回结果。原创 2024-08-05 12:00:04 · 337 阅读 · 0 评论 -
Haskell:算法练习——数字反转
算法练习:数字反转。输入一个数,例如12345,返回数字反转后的数字,例如54321。用 Rust 开发过两个项目后,忽然感觉对 Haskell 更加理解了。原创 2024-07-24 16:23:34 · 144 阅读 · 0 评论 -
无状态程序设计的本质
这样,大部分数据是共享的,只有变化的部分是新建的。换句话说,如果把请求和数据库的内容都看作系统的输入,那么系统的输出(即请求的处理结果)应该只与这些输入有关,而不依赖于任何其他外部状态或之前的请求历史。综上所述,虽然纯粹的无状态的函数式程序设计在表面上看起来无法在内存中保存数据,但实际上通过闭包、Monads、持久数据结构等机制,可以在不违反函数式编程原则的前提下模拟和处理状态。在无状态设计中,系统的行为只取决于当前的请求内容和数据库的当前状态,而不依赖于之前的请求历史或会话状态。原创 2024-05-28 15:08:33 · 1750 阅读 · 0 评论 -
Haskell 开发的实际产品
Haskell 不仅被用于开发各种实用的工具和库,还被应用于构建安全、高效的微服务以及公司级的监控软件等产品。这些实例证明了 Haskell 在实际产品开发中的可行性和价值。原创 2024-05-28 15:01:57 · 455 阅读 · 0 评论 -
Haskell:社区和技术支持
综上所述,Haskell 社区和技术支持相当成熟和活跃。无论是初学者还是经验丰富的开发者,都能在Haskell社区中找到所需的学习资源、技术支持和交流机会。原创 2024-05-28 15:00:22 · 302 阅读 · 0 评论 -
比较Rust和Haskel
在比较Rust和Haskell时,我们可以从多个维度来分析它们各自的优势。原创 2024-05-28 14:55:46 · 1089 阅读 · 0 评论 -
从 C++ 走向 rust(八):走进函数式编程——匿名函数
虽然 rust 与 haskell 相比,并不是真正的函数式编程,但不得不说,还真的有点 haskell 的意思。我们看一个匿名函数:1. 一个简单的匿名函数fn main() { let inc = |x| x + 1; println!("{}", inc(1))} 运行一下,结果显示 2,很好吧?2. 函数是一等公民?haskell 有一个令人印象很深的特点,就是函数和“变量”没有区别。例如,我们可以定义 inc 函数如下:inc x = x + 1够简单吧?在原创 2021-02-18 18:39:03 · 1098 阅读 · 0 评论 -
感觉学习 Haskell已经开始“中毒”了
今天想用 C 写一段复杂一点的算法,写了个开头感觉快烦死了,很多工作在 Haskell 里面都是不需要操心的。看看下面的代码,感觉 C 语言里面的小零碎东西太多了。int sum(int n) { int result = 0; for (int i = 1; i <= n; ++i) { result += i; } return result;}换成 Haskell,...原创 2018-12-30 17:55:28 · 1783 阅读 · 3 评论 -
用 Haskell 求解 ACM 竞赛题(10):最大连续和问题
最大 连续 和 问题。 给出 一个 长度 为 n 的 序列 A[1], A[2],…, A[n], 求 最大 连续 和。 换句话说, 要求 找到 1 ≤ i ≤ j ≤ n, 使得 A[i] +…+A[j] 尽量 大。C语言关键代码如下:tot = 0; best = A[1]; //初始 最大值 for (int i = 1; i <= n; i++) { for (int j ...原创 2018-12-15 22:58:24 · 591 阅读 · 0 评论 -
Haskell寻找二维数组中最大值位置
今天看到一个 Haskell 问题,感觉回复的答案都不很理想。函数式编程语言不见得就能写出好程序。我按照自己的思路最后也写了一个程序,测试通过。问题:对于一个二维数组,[[1,2,3],[4,5,6],[7,8,9]]怎样用Haskell找到最大值的位置呢?可以不获得最大值的值。我写了半天,没有找到很简单的方法。解答1- 乱写一个,不考虑效率和优雅。也没考虑空列表。 import Dat...原创 2018-11-21 22:35:54 · 1412 阅读 · 0 评论 -
用 Haskell 求解 ACM 竞赛题(9):环状序列(Circular Sequence, ACM/ ICPC Seoul 2004, UVa1584)
问题:环状序列(Circular Sequence, ACM/ ICPC Seoul 2004, UVa1584) 环状串长度 为 n 的环状串 有 n 种 表示 法, 分别为从某个位置开始顺时针得到。 例如, 图 3- 4 的环状串有 10 种表示: CGAGTCAGCT, GAGTCAGCTC, AGTCAGCTCG 等。 在这些表示法 中, 字典序最小的称为" 最小表示"。 输入一个长度为...原创 2018-11-15 21:44:39 · 335 阅读 · 0 评论 -
用 Haskell 求解 ACM 竞赛题(8): 生成 元( Digit Generator, ACM/ ICPC Seoul 2005, UVa1583)
问题:如果 x 加上 x 的 各个 数字 之和 得到 y, 就说 x 是 y 的 生成 元。 给出 n( 1 ≤ n ≤ 100000), 求 最小 生成 元。 无解 输出 0。 例如, n= 216, 121, 2005 时 的 解 分别为 198, 0, 1979。C 语言代码:#include <stdio.h> #include <string.h&amp原创 2018-11-15 21:10:17 · 313 阅读 · 3 评论 -
用 Haskell 求解 ACM 竞赛题(7):阶乘之和
问题:阶乘 之和输入 n, 计算 S = 1! + 2! + 3! +… + n! 的末 6 位( 不含前导 0)。 n≤106n ≤ 10^6n≤106, n! 表示前 n 个正整数之积。样例输入: 10样例输出: 37913【分析】 这个任务并不难, 引入累加变量 S 之后, 核心算法只有“ for( int i = 1; i < = n; i + +) S + = i!”。 不过...原创 2018-11-11 12:21:04 · 740 阅读 · 0 评论 -
用 Haskell 求解 ACM 竞赛题(6):3n + 1 问题
3n + 1 问题猜想: 对于任意大于 1 的自然数 n, 若 n 为奇数, 则将 n 变为 3n + 1, 否则变为 n 的一半。 经过若干次这样的变换, 一定会使 n 变为 1。 例如, 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1。 输入 n, 输出变换的次数。 n ≤ 109。样例输入: 3样例输出: 7C语言代码:#include <stdio.h&...原创 2018-11-11 11:43:16 · 456 阅读 · 0 评论 -
用 Haskell 求解 ACM 竞赛题(5):for 循环
for 循环考虑这样一个问题: 打印 1, 2, 3,…, 10, 每个 占 一行。本着“ 解决问题 第一” 的思想, 很容易写出程序: 10 条 printf 语句就可以了。 或者也可以写一条, 每个数 后面加 一个“\ n” 换行符。 但如果把 10 改成 100 呢? 1000 呢? 甚至这个重复次数是可变的:“ 输入正整数 n, 打印 1, 2, 3,…, n, 每个占一行。” 又怎么...原创 2018-11-10 10:09:36 · 1129 阅读 · 0 评论 -
用 Haskell 求解 ACM 竞赛题(4):分支结构程序设计
鸡兔同笼(程序1-11)例题 鸡兔同笼: 已知鸡和兔的总数量为 n, 总腿数为 m。 输入 n 和 m,依次输出鸡的数目和兔的数目。 如果无解, 则输出 No answer。样例输入: 14 32样例输出: 12 2样例输入: 10 16样例输出: No answer设鸡有 a 只, 兔有 b 只, 则 a + b = n, 2a + 4b = m, 联立解得 a =( 4n-m)...原创 2018-11-09 23:12:43 · 353 阅读 · 0 评论 -
用 Haskell 求解 ACM 竞赛题(3):顺序结构程序设计
三位数反转例题 三位数反转:输入一个三位数, 分离出它的百位、 十位和个位,反转后输出。样例输入: 127样例输出: 721【分析】 首先将三位数读入变量 n, 然后进行分离。 百位等于 n/ 100( 注意这里取的是商 的整数部分),十位等于 n/10% 10(这里的%是取余数操作),个位等于 n%10。程序如下:程序1-6三位数反转C 语言代码如下:#include <...原创 2018-11-09 22:45:23 · 372 阅读 · 0 评论 -
用 Haskell 求解 ACM 竞赛题(2):变量及其输入
上一节的程序虽好, 但有一个遗憾: 计算的数据是事先确定的。 为了计算 1 + 2 和 2 + 3, 下面不得不编写两个程序。 可不可以让程序读取键盘输入,并根据输入内容计算结果呢? 答案是肯定的。 程序如下:程序 1- 4 a+ b 问题#include&amp;lt;stdio.h&amp;gt; int main() { int a, b; scanf(&quot;% d% d&quot;, &原创 2018-11-09 22:14:50 · 659 阅读 · 0 评论 -
用 Haskell 求解 ACM 竞赛题(1):Hello,World!
找了一本用C语言编写的ACM竞赛教程,把其中的程序用 Haskell 重写一遍,这可能是熟悉 Haskell 的最好办法。首先我们看一看 Hello 程序如何实现。如果有 C 语言基础,应该很容易理解 Haskell 代码。Hello, worldmain = do putStrLn &amp;quot;Hello, world!&amp;quot;代码相当简单吧。其中 putStrLn 相当于 C 语言的 prin...原创 2018-11-09 18:38:22 · 688 阅读 · 1 评论 -
Haskell 学习笔记-15:IO操作,有状态/无状态世界的隔离与结合
下面的程序可以接受键盘输入的数据。main = do putStrLn "Hello, what' s your name?" name <- getLine putStrLn ("Hey " ++ name ++ ", you rock!")getLine 每次调用,返回结果可能都会不同,这一点和 Haskell 所说的函数有很大不同,因此,把它...原创 2018-06-26 11:51:35 · 901 阅读 · 0 评论 -
Haskell 学习笔记-14:再写 Hello World,编译成 exe 文件
写下面的程序:main = putStrLn &quot;Hello, world!&quot;在命令行环境下键入命令:&amp;gt;&amp;gt; G:\HaskellTest&amp;gt;C:\ghc-8.4.3\bin\ghc.exe hello.hs&amp;gt;&amp;gt; dir驱动器 G 中的卷是 xxxx卷的序列号是 0000-0000C:\Ha原创 2018-06-26 09:06:18 · 2200 阅读 · 0 评论 -
Haskell 学习笔记-13:最短的排序程序
昨天的代码令我想起最短的排序算法,当然只针对可枚举的类型:sort list = [x | x <- [minimum list.. maximum list], elem x list]测试一下,非常OK!>> sort [8,5,23,4,5,3,121,324][3,4,5,8,23,121,324]...原创 2018-06-22 08:41:08 · 410 阅读 · 0 评论 -
Haskell 学习笔记-12:过程的函数式描述——开灯问题
有一种说法,说是函数式编程不擅长过程式,我特地找一个过程性问题试一试。问题: 开灯 问题。 有 n 盏灯, 编号 为 1 ~ n。 第 1 个人 把 所有 灯 打开, 第 2 个人 按下 所有 编号 为 2 的 倍数 的 开关( 这些 灯 将被 关掉), 第 3 个人 按下 所有 编号 为 3 的 倍数 的 开关( 其中 关掉 的 灯 将被 打开, 开着 的 灯 将被 关闭), 依此类推。 ...原创 2018-06-21 08:31:44 · 299 阅读 · 0 评论 -
Haskell 学习笔记-11:蛇形填数算法
练习:在 n×nn×nn \times n 矩阵填充练习自然数,例如:⎛⎝⎜⎜⎜11211102131693141584567⎞⎠⎟⎟⎟(12341213145111615610987)\left(\begin{matrix}1 &amp; 2 &amp; 3 &amp; 4 \\12 &amp; 13 &amp; 14 &amp; 5 \\11 &amp; 16 &a原创 2018-06-20 11:47:31 · 287 阅读 · 0 评论 -
Haskell 学习笔记-10:高精度除法、排列枚举算法实现
练习1 编写函数 divDecimal a b c,计算 a/b,保留 c 位小数。divDecimal a b c = (div a b):(div3' (10*(mod a b)) b c) where div3' a b 0 = [] div3' a b c = (div a b):(div3' (10*(mod a b)) b (c-1))练习2...原创 2018-06-19 18:45:33 · 806 阅读 · 0 评论 -
原 Haskell 学习笔记-09:练习代码重构
返回去看前几天写的代码,感觉有些 low,重新写一下。1、三个数排序,提供一个易读性较好的方案。sortThreeNum x y z | x &amp;amp;amp;amp;amp;amp;amp;lt;= y &amp;amp;amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp;amp;amp; y &amp;amp;amp;amp;amp;amp;amp;lt;= z =原创 2018-06-18 08:55:51 · 428 阅读 · 0 评论 -
Haskell 学习笔记-08:矩阵乘法——难度不过如此
C 语言矩阵乘法伪代码如下:mat matMul(mat x, mat y){ mat result = new mat(x.rows, y.cols); for (int i = 0; i &amp;amp;amp;amp;amp;lt; x.rows; ++i){ for (int j = 0; j &amp;amp;amp;amp;amp;lt; y.cols; ++j){ result[i][j] = 0;原创 2018-06-17 12:57:10 · 4567 阅读 · 1 评论 -
Haskell 学习笔记-07:矩阵加法——探索循环语句的实现
C语言伪代码矩阵加法在 C 语言中很容易实现,伪代码如下:mat matadd(mat a, mat b){ mat result; for (int i = 0; i &amp;amp;amp;amp;lt; x.rows; ++i){ for (int j = 0l j &amp;amp;amp;amp;lt; x.cols; ++j){ result[i][j] = a[i][j] + b[...原创 2018-06-16 20:20:32 · 1601 阅读 · 0 评论 -
Haskell 学习笔记-05:为什么函数式编程流行不起来?
今天有些想入非非了,随便看几个这几天写过的算法:求列表中的最小元素: min' ::Ord(a)=&gt; [a] -&gt; a min' [] = error "List is empty!" min' (x:[]) = x min' (x:xs) = if x &lt; min' xs then x else min' xs快速排序算法:quicksort :: (...原创 2018-06-15 10:30:07 · 867 阅读 · 2 评论 -
Haskell 学习笔记-06:矩阵问题——函数式编程真不容易
函数式编程语言没有循环命令,因此,需要用循环解决的问题一般都用递归代替。但是,很多问题的确不适合递归,比如矩阵的相关操作。这里我写了一组和矩阵有关的练习,探讨一下如何处理这类问题。练习1 在 N 阶方阵中填写自然数序列,例如: $$$$...原创 2018-06-15 12:49:45 · 2117 阅读 · 0 评论 -
Haskell 学习笔记-04:查找算法
顺序查找充分利用 Haskell 的列表推导式,可以大大简化代码:find x list = [(n,y) | (n,y) <- zip [0.. ] list, y == x]>>find 5 [1,2,3,4,5,0,1,2,3,4,5,6,7,8,9][(4,5),(10,5)]二分查找利用哨位,可以避免一大坨 if else 嵌套。同时,where ...原创 2018-06-10 20:55:11 · 968 阅读 · 0 评论 -
Haskell 学习笔记-03:函数式编程与量子计算
鸡兔同笼已知鸡和兔的总数量为 n, 总腿数为 m。 输入 n 和 m, 依次输出鸡的数目和兔的数目。 如果无解, 则输出 No answer。 此问题 C 语言代码如下:#include< stdio. h>int main() { int a, b, n, m; scanf("% d% d", &n, &m); a = (...原创 2018-06-10 08:09:47 · 684 阅读 · 0 评论 -
Haskell 学习笔记-02:函数是第一类对象
函数是第一类对象第一 类 对象( first- class object) 指可在运行期创建, 可用作函数参数或返回 值, 可存入变量的实体。 最常见的用法就是匿名函数。在学数学的时候,经常见到下面这些表示方法:x=123f(x)=x2+3x−12g(x,y)=xy+5x2−log(y)x=123f(x)=x2+3x−12g(x,y)=xy+5x2−log(y)x=123\\f(x...原创 2018-06-09 21:07:29 · 405 阅读 · 0 评论 -
Haskell 学习笔记-01:Hello, World!
闲扯函数式编程函数式编程语言一直是叫好不叫座,用函数式编程语言开发的应用项目并不多。我分析其原因,感觉根本原因在于当今 CPU 的指令体系是面向过程的,换句话讲, C 语言这个家族的编程语言,C++、Java、C#、Delphi 等,是与 CPU 指令体系同构的,因此,用他们写程序,自然很顺手,而且目标代码执行起来效率很高。说起当今的 CPU 的指令体系,可追溯到图灵机概念的产生。图灵机把...原创 2018-06-08 17:59:28 · 2102 阅读 · 0 评论 -
Haskell 学习笔记-16:一个简单的应用程序
如果不考虑运行速度,感觉函数式编程还是很方便的。发现可以用 read 函数实现字符串专为数字,当然也可以转成其他类型。-- 选择菜单。(带副作用的IO编程,和传统编程语言类似。) select_action = do putStrLn &quot;&quot; putStrLn &quot;&quot; putStrLn &quot;班级成绩管理系统 主菜单&quot;原创 2018-06-29 23:18:50 · 1807 阅读 · 0 评论 -
Haskell 学习笔记-17:when 函数的实现
Haskell 库里有一个函数 when,可以实现 if … then … 的功能,不需要考虑 else 的情况,这样写起程序来很是方便。这里作为练习,我把代码重新写了一下,估计库函数也是这个套路。when x y = do if x then y else return ()main = do putStr "Input = " s &lt;- ge...原创 2018-07-01 10:58:46 · 609 阅读 · 0 评论 -
Haskell 学习笔记-18:sequence、mapM、forever 的实现
编写函数,很容易混淆返回类型。如果函数有副作用,必须用 return 返回类型。从有副作用的函数”取值“,必须用 <- 。另外 return 后面如果有复杂表达式,还是用括号扩起来吧,因为 return 和后面符号结合的优先级很高,不小心就出现符号结合顺序的错误。sequence' [] = return []sequence' (x:xs) = do a <- x...原创 2018-07-01 13:39:47 · 1104 阅读 · 0 评论 -
Haskell 学习笔记-19:函数式编程与过程式编程的本质性区别
这些天不断在联系的过程中思考这个问题,函数式编程和传统的过程式编程的本质区别是什么呢?我觉得什么函数是第一类对象、匿名函数、λλ\lambda函数、闭包等等,都不是这个问题的关键。原创 2018-07-03 11:58:14 · 1622 阅读 · 0 评论 -
点评一下《黑 Haskell 全集》
今天看了一篇黑 Haskell 的帖子,转过来供参考,根据本人的理解,假如本人的点评。。原帖地址如下:黑 Haskell 全集 1、对函数式语言的误解很早的时候,“函数式语言”对于我来说就是 Lisp,因为 Lisp 可以在程序的几乎任何位置定义函数,并且把它们作为值来传递(这叫做 first-class function)。后来有人告诉我,Lisp 其实不算是“函数式语言”,因为 L...原创 2018-08-30 16:31:35 · 3397 阅读 · 4 评论