![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
haskell
文章平均质量分 74
the only KIrsTEN
这个作者很懒,什么都没留下…
展开
-
设计模式中Monoid/Foldables
在 Haskell 中,Monoids幺半群是一种类型,其中包含该类型的两个元素的规则可以组合成另一个相同类型的元素。Foldable 类型类包括许多其他我们曾经使用过的函数,那些被认为是特定于列表的,例如长度、元素elem、最小值、最大值,总和,乘积product。>)(读作“ap”),它采用 f 类型的装箱函数 (a ->b) 将其应用于 f a 类型的装箱参数,并产生 f b 类型的装箱结果。和 () 都是最小完备的,也是最常用的函数的,Applicative 类型类。原创 2022-08-21 10:00:00 · 205 阅读 · 0 评论 -
Haskell 的 IO 和Monad
• Haskell 将“惰性求值”扩展到 IO,例如,如果您要求读取整个文件 Haskell 仅在需要时从其中读取数据。• 如果您允许在函数体内进行这样的操作,那么您永远无法确定给定相同的参数,该函数将始终返回相同的值。Haskell 强制在处理 i/o 的函数之间进行清晰的分离,允许“纯粹”的动作和功能,它们是定义。• 您只能在 IO a 的函数中使用返回类型为 IO a 的现有函数(例如 getLine)• 本质上,IO 函数隐含地将“世界状态”作为输入并返回新的世界状态作为输出的一部分。原创 2022-08-20 10:00:00 · 619 阅读 · 0 评论 -
设计和实施
• 计算每个子列表的所有可能排列,取子列表中的第一项,并在所有可能的位置尝试它子列表其余部分的排列每个可能的位置:在第一个位置,然后在第一个位置之后的所有可能位置。• 对于列表中的第一项,获取从该点开始的所有子列表,从该点开始的子列表: item :(子列表的其余部分)然后对列表的其余部分执行相同操作。• 如果一个函数有多个由不同模式触发的方程,同样的原则也适用:Haskell 通过按顺序排列方程,进行足够的评估以能够决定图案是否合适。什么叫它,它叫什么?• 对于每个子列表,获取该列表的所有可能排序。原创 2022-08-20 09:00:00 · 165 阅读 · 0 评论 -
错误error 和例外Exceptions
现在,如果我们愿意,我们可以从错误中恢复……如果我们有 Just 的东西(Just a),我们可以使用某物。表达式,其值为目标,通过组合来自的一个或多个数字使用加法、减法、乘法、除法和插入语。• 对于我们的示例,在 3300 万个可能中只有大约 500 万个表达式是有效的。• 如果我将目标更改为 831(但保持相同的序列),则没有单一的解决方案。• 所有数字,包括中间结果,都必须是正自然数(1,2,3,…自 1982 年以来的英国电视,包括我们的数字游戏。• 我们从电视上采用的其他规则中提炼出务实的原因。原创 2022-08-19 18:41:15 · 499 阅读 · 0 评论 -
Haskell中map/filter/zip以及fodlr来实现功能的例子
函数 find 返回满足谓词的列表的第一个元素,如果没有这样的元素,则返回 Nothing。findIndex 返回对应的索引。这里(p,n) -> p 就代表了p是True的情况,如果想要代表False那么只需要加一个not变成以下这样(p,n) -> not p。这种[]的基本模板是,首先把结果放在最前面比如这里的(a,b,c)然后用分割线隔开, 把每个成分的范围说明,最后才是三者之间的联系。当filter的东西比较多时,这是一个很好的例子。let in 也可以实现找到最大共因数。...原创 2022-08-19 11:15:00 · 330 阅读 · 0 评论 -
take和 drop功能还有takewhile 和 dropwhile 功能主要用于分开list
takeWhile 的 type 是(a -> Bool) -> [a] -> [a] 这意味着当它满足a是True 的情况下才会take.然而take的type却是Int -> [a] -> [a],代表的意思是第一个参数确定应该从作为第二个参数传递的列表中获取多少项.)(reverse 本身的确是将list 翻转, 但是由于这个公式在进行比较,不仅是=;本身的tail是不包含[] 和只有一个元素的情况,这里有三种不同的方式来让tail 可以包含所有的情况。(这个公式是用于string).........原创 2022-08-18 10:00:00 · 218 阅读 · 0 评论 -
如何在powershell 运行Haskell文件
然后如果是最基础的,那就直接输入ghci进入ghci的系统进行一些最基本的功能,比如说库里本身有的一些功能.例如add/odd/double 等等.如果是要进入hs的文件里的话,首先得cd 到该去的文件夹里,紧接着输入ghci +文件具体名。首先得下载好stack然后去安装ghcup在poweshell中。如果文件本身也没有问题,终端就会显示。我这里的1.hs就是文件名。...原创 2022-08-16 21:40:51 · 253 阅读 · 0 评论 -
二进制搜索树(BSTs) 和AVL 树
基本数据结构元素可以包含卫星数据,并且使用一个键来标识该元素。对动态集 S 的操作:Search(S, k):返回带有键 k 的元素 x,或 NILInsert(S, x):将元素 x 添加到 SDelete(S, x):从 S 中删除元素 x最小值(S),最大值(S):仅适用于全序集Successor(S, x), Predecessor(S, x):下一个或上一个元素直观地说:每个节点最多有两个子树。我们可以递归地定义二进制树:它是一个定义为有限节点集的结构,使得树为空(无节点)或它由根原创 2022-08-16 13:00:00 · 1270 阅读 · 0 评论 -
Haskell 组合运算符
你不必;这只是简写。原创 2022-08-16 11:30:00 · 379 阅读 · 0 评论 -
Haskell高阶函数(归并排序mergesort,map,filter)
从这个例子中概括,任何对 fold 应用到同一个列表总是可以组合起来,通过调用 fold 的所谓的“香蕉拆分”属性来给出一个单独的 fold 应用来生成一个对(Meijer,1992) .这个属性的奇怪名称源于这样一个事实,即折叠运算符有时使用类似于香蕉的括号 (| |) 编写,而配对运算符有时称为拆分。Currying 是函数式语言(和其他语言)的一个特性,以逻辑学家 Haskell Curry 的名字命名(是的,Haskell 也是以他的名字命名的)将函数作为参数的函数的正式术语是高阶函数。...原创 2022-08-16 11:00:00 · 529 阅读 · 0 评论 -
Haskell用户定义的类型
类型同义词您已经有一个用户定义类型的示例:type Cipher = String如果需要,可以嵌套类似这种情况的类型同义词:(Pos 表示 2D 点,Trans 是采用一个 2D 点并返回另一个点的函数的类型)虽然您可以引用其他类型的同义词,并将它们嵌套在中,但您不能自行引用它们定义新类型如果要定义一个全新的类型(而不是现有类型的同义词),则需要使用数据机制例如,Bool 在标准 Prelude 中定义如下:数据布尔 = 假 | 真的“|”读作“或”,替代项称为构造函数。...原创 2022-08-15 19:02:33 · 606 阅读 · 2 评论 -
haskell 的where 或者 let ..in 表达式以及if-else嵌套
是一个表达式,也就是说,它可以写在任何允许表达式的地方。相反, where 绑定到周围的句法结构,例如函数定义的模式匹配行。我个人认为使用 where 可以让事情更自然地阅读,但除非你使用 let 的方式大大降低了可读性,否则我不会惩罚它。您可以只编写单独的“帮助”函数,但如果它仅在非常本地的上下文中需要,则本地定义可以使其更具可读性,也可以使用局部定义来避免重复计算。如果你有一个带守卫的函数,那么 let 的范围是单个子句,而 where 适用于整个函数。本地定义允许您将事情分解为更简单的步骤。...原创 2022-08-15 11:30:00 · 551 阅读 · 0 评论 -
Haskell多重递归,相互递归(合并排序Merge Sort)
在 Java/C/Python/etc 中可能需要 10 行代码的事情通常可以在 Haskell 中用几行简洁易懂的行来表达。我们查看了一个示例,在该示例中,字符串中的一个字符被另一个字符替换。更有用的是一个函数,其中一个子字符串被另一个子字符串替换。将其移动到排序序列中的最终位置,使所有较小的元素都在其左侧,较大的元素在其右侧。函数式编程编译器非常复杂,编程语言中更高级别的抽象意味着编译器会做更多的工作,有一些技术允许编译器删除递归。基本算法:将列表分成两半,对每一半进行排序,将两个排序列表合并在一起。.原创 2022-08-15 10:45:00 · 300 阅读 · 0 评论 -
Haskell递归的基本概念和列表上的递归
今天我们介绍了:递归的基础。特别是,为了有用,递归函数必须有一个基本案例(告诉它何时停止递归)递归到那个基本情况(这样我们最终可以得到答案)和Haskell 中递归定义的一般方法原创 2022-08-15 10:15:00 · 266 阅读 · 0 评论 -
haskell的列表推导中的基本概念和其他列表功能head/tail/take/drop
总结:1.像以前一样生成列表很有用,但如果你可以添加警卫,那就更有用了。添加警卫等于添加限制。2.这两个功能不同3.凯撒密码The Caesar cipher4.其他列表功能head/tail/take/drop…原创 2022-08-15 10:00:00 · 269 阅读 · 0 评论 -
Haskell 函数(包括条件表达式,模式匹配,在特定范围内的变化)
**功能**请记住,对于函数式编程,您需要以不同的方式考虑问题。与其说明要执行的步骤,不如考虑如何转换输入。(我知道现在这听起来很模糊,但是一旦你“得到”它,你就会“得到”函数式编程。)编写函数最直接的方法是使用现有函数,例如square n = n * nodd n = n `mod` 2 /= 0mod 是一个带有两个参数的函数,所以通常你会写成 mod n 2通过在它周围加上反引号 (`),我们将它变成了一个中缀运算符(如 +、- 等),并且可以以更自然的形式使用它。总之,mod代表得到原创 2022-08-14 13:00:00 · 635 阅读 · 0 评论 -
haskell 基本布局和组成元素
基本类型:Bool、Char、String、Int、Integer、Float、Double列表(字符串实际上只是特殊列表)元组类和重载多态性标准前奏曲(The standard Prelude)Prelude 是 Haskell 编译器默认加载的模块它包含所有标准库函数——定义自己的函数时可以使用的函数有些功能会被大量使用,有些则永远不会。一些有用的 Prelude 功能:!...原创 2022-08-14 11:00:00 · 248 阅读 · 0 评论 -
详细讲解haskell的类
数字类型类(class Num及其下面的类)占了许多标准Haskell类。我们还注意到Num是Eq的子类,但不是Ord的子类;这是因为顺序谓词不适用于复数。然而,Num的子类Real也是Ord的子类。Num类提供了几个对所有数值类型通用的基本操作;其中包括加法、减法、否定、乘法和绝对值:(+),(-),(*)::(数值a)=>a->a->a否定,abs:(numa)=>a->anegate是Haskell唯一的前缀运算符减号应用的函数;我们不能称它为(-),因为它是减法原创 2021-10-29 04:09:23 · 437 阅读 · 0 评论