Questions tagged «haskell»

一种功能编程语言


2
报告Haskell错误的最干净方法
我正在学习Haskell,并且遇到了三种不同的方法来处理我编写的函数中的错误: 我可以简单地编写error "Some error message.",从而引发异常。 我可以让我的函数return Maybe SomeType,在这里我可能无法返回我想返回的内容。 我可以使用函数return Either String SomeType,在这里我可以返回错误信息或首先要返回的内容。 我的问题是:我应该使用哪种处理错误的方法,为什么?根据上下文,也许我应该使用不同的方法? 我目前的理解是: 在纯功能代码中处理异常是“困难的”,在Haskell中,人们希望将事物保持尽可能纯的功能。 Maybe SomeType如果函数失败或成功(即,失败的方式没有不同),则返回是正确的做法。 Either String SomeType如果函数可能以各种方式中的任何一种失败,则返回是正确的做法。

1
为什么Haskell不具有类型级别的lambda抽象?
是否有一些理论上的原因(例如类型检查或类型推断变得不确定)或实际原因(太难于正确实现)? 目前,我们可以换东西到newtype像 newtype Pair a = Pair (a, a) 然后有 Pair :: * -> * 但是我们不能做这样的事情λ(a:*). (a,a)。 (有一些语言可以使用它们,例如Scala可以。)

2
类型检查和递归类型(在Haskell / Ocaml中编写Y组合器)
当在Haskell的上下文中解释Y组合器时,通常会注意到,由于Haskell的递归类型,因此直接实现不会在Haskell中进行类型检查。 例如,从Rosettacode: The obvious definition of the Y combinator in Haskell canot be used because it contains an infinite recursive type (a = a -> b). Defining a data type (Mu) allows this recursion to be broken. newtype Mu a = Roll { unroll :: Mu a -> a } …

1
Haskell构建和工件环境类似于Maven
我曾经是Java开发人员很长一段时间,但是最近我加入了Haskell团队。在Java世界中,如果您有一个大型项目,并且有多个团队在工作,那么一种常见的方法是使用工件服务器(例如Maven)来简化和加速开发。许多构建工具(例如Ant,Maven,Gradle)都可以构建项目并将jar文件上传到工件服务器,团队其他成员可以轻松使用。因此,通过将项目拆分为较小的子项目,还可以大大减少构建时间。 在Haskell方面,我们正在使用cabal该项目。我们的项目大约需要10-15分钟才能完成构建,而无需进行优化。如果打开编译器优化,则需要几个小时,这很痛苦。 我想知道,如何才能像在Java中一样做同样的事情。有没有一种简单的方法可以编译软件包(库)的二进制文件并将其上传到工件服务器,并在构建时使用预构建的二进制文件?我知道,因为Haskell生成机器代码(而不是Java中的字节码),所以可能存在兼容性问题,但是对于存储在工件服务器上的不同体系结构/操作系统,我们可能具有不同的二进制文件。

2
是否可以在Haskell中“将维度转换为类型”?
假设我想编写一个处理向量和矩阵的库。是否可以将维度烘焙为类型,以使不兼容的维度的操作在编译时产生错误? 例如,我希望点积的签名类似于 dotprod :: Num a, VecDim d => Vector a d -> Vector a d -> a 其中d类型包含单个整数值(代表这些Vector的维)。 我想可以通过为每个整数定义一个单独的类型并将其分组为一个名为的类型类来实现VecDim。是否有某种机制可以“生成”此类类型? 还是一些更好/更简单的方法来实现同一目标?

3
如何通过函数式编程提高效率?
最近,我一直在阅读“ 学习Haskell以获得卓越成就”指南,并且作为练习,我想用它来解决Euler问题5,该问题指定了: 能被1到20的所有数均分的最小正数是多少? 我决定首先编写一个函数,以确定给定数字是否可被这些数字整除: divisable x = all (\y -> x `mod` y == 0)[1..20] 然后,我使用计算了最小的head: sm = head [x | x <- [1..], divisable x] 最后写一行来显示结果: main = putStrLn $ show $ sm 不幸的是,这花了大约30秒才能完成。用数字1到10进行相同的操作几乎会立即产生结果,但是结果又比1到20的解小得多。 我在C中较早地解决了该问题,并且几乎立即就可以计算出1到20的结果。这使我相信我误解了如何为Haskell解释这个问题。我查看了其他人的解决方案,发现了以下几点: main = putStrLn $ show $ foldl1 lcm [1..20] 公平地说,这使用了内置函数,但是为什么自己动手最终结果会这么慢?那里的教程告诉您如何使用Haskell,但是在将算法转换为快速代码方面我没有看到太多帮助。
20 haskell 

3
haskell有依赖类型吗?
我知道Haskell已经可以对另一个类型进行参数化(类似于C ++中的模板编程),但是我想知道Haskell是否也可以对值进行参数化-是否支持依赖类型。使用从属类型,您可以拥有在整数上参数化的类型,例如大小为n的向量,大小为n×m的矩阵等。 如果没有,为什么不呢?将来是否有可能获得支持?
20 haskell 

4
Haskell擅长教授数学基础知识吗?
已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 我参与了对诸如AS和A Level数学规范之类的要求进行数学教学的课程。 课本通常提供适用于数学任务的计算机软件示例,但它们通常基于Mathlab,mathematica或推导之类的软件应用程序。 即使使用真正的编程语言,它也通常是古老的常用语言,例如Pascal。我认为这真的很可悲。 因为Haskell以他对数学的感觉而闻名,并且因为我也对它感兴趣,所以我想问一问Haskell是否适合作为大学一年级学生的延伸锻炼方法。典型的主题是函数,弯度,极限,例如线性代数。 我具有编程方面的中级知识(c#,ruby,powershell,javascript,tex),并且已经使用XSLT进行函数式编程。 答案将负责任地予以推荐。详细的答案还包括应用于数学的Haskell代码的一些基本示例,例如线性代数(例如矢量空间),多项式,求解线性方程式,受到人们的广泛欢迎和关注。
19 haskell 

1
Haskell Web框架调查[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 5年前关闭。 Haskell有多个Web框架,例如Happstack,Snap和Yesod,还有可能更多。 它们在哪些方面有所不同?例如: 功能(例如,仅服务器,或客户端脚本,轻松支持各种数据库) 成熟度(例如稳定性,文档质量) 可扩展性(例如性能,方便的抽象) 主要目标 另外,使用这些框架的真实网站/ Web应用程序的例子有哪些? 非常感谢。

4
持久性如何适合纯功能性语言?
使用命令处理程序处理持久性的模式如何适合于一种纯函数式语言,在这种语言中,我们希望使与IO相关的代码尽可能的薄? 当以面向对象的语言实现域驱动设计时,通常使用命令/处理程序模式执行状态更改。在这种设计中,命令处理程序位于您的域对象之上,并负责无聊的与持久性相关的逻辑,例如使用存储库和发布域事件。处理程序是您域模型的公开面孔;诸如UI之类的应用程序代码在需要更改域对象的状态时会调用处理程序。 C#中的草图: public class DiscardDraftDocumentCommandHandler : CommandHandler<DiscardDraftDocument> { IDraftDocumentRepository _repo; IEventPublisher _publisher; public DiscardDraftCommandHandler(IDraftDocumentRepository repo, IEventPublisher publisher) { _repo = repo; _publisher = publisher; } public override void Handle(DiscardDraftDocument command) { var document = _repo.Get(command.DocumentId); document.Discard(command.UserId); _publisher.Publish(document.NewEvents); } } 该document域对象是负责执行业务规则(如“用户应该有权丢弃文档”或“你不能放弃一个已经被丢弃的文件”),并产生我们需要发布域事件(document.NewEvents会是一个IEnumerable<Event>,并且可能包含一个DocumentDiscarded事件)。 这是一个不错的设计-易于扩展(您可以通过添加新的命令处理程序来添加新用例,而无需更改域模型),并且不知道对象的持久化方式(可以轻松地将NHibernate存储库换成Mongo存储库,或将RabbitMQ发布者替换为EventStore发布者),这使得使用伪造品和模拟进行测试变得容易。它还遵循模型/视图分离-命令处理程序不知道批处理作业,GUI或REST API是否正在使用它。 在Haskell这样的纯功能语言中,您可以大致像这样对命令处理程序进行建模: newtype CommandHandler = CommandHandler {handleCommand :: …

3
最快的功能语言
我最近一直在研究函数式编程,尤其是Haskell和F#,而以前更是如此。经过一番探索之后,我找不到比较杰出的功能语言(Scala,F#等)的基准比较。 考虑到它们是混合语言,我知道这对某些语言(Scala出现)不一定是公平的,但我只想知道哪种语言在哪种操作和总体上胜过哪种语言。

1
Haskell记录的进度如何?
最近,我再次迷失了Haskell记录的问题,尤其是字段名称的唯一性。(这很痛苦...) 我已经读过SPJ和Greg Morrisett的Haskell记录提案,但是最近一次更新是在2003年。SPJ和Mark Jones撰写的 另一篇名为《 Haskell的轻量可扩展记录》的论文甚至更老:它来自1999年Haskell研讨会。 现在,我想知道为Haskell提供新记录的过程是否取得了任何进展。 有人对此有所了解吗?有人可以指点我进一步阅读吗?


3
为什么没有函数的类型类?
在一个我一直在纠缠的学习问题中,我意识到我需要一个具有用于应用,编写等操作的函数的类型类。原因... 将函数的表示形式视为函数本身就是方便的,因此隐式应用函数将使用解释器,而组成函数会得出新的描述。 一旦有了函数的类型类,就可以为特殊类型的函数派生类型类-就我而言,我想要可逆函数。 例如,应用整数偏移量的函数可以由包含整数的ADT表示。应用这些功能仅意味着将整数相加。通过添加包装的整数来实现合成。逆函数的整数取反。身份函数包装零。无法提供常量函数,因为没有合适的表示形式。 当然,它不需要像值是真正的Haskell函数那样拼写事物,但是一旦我有了主意,我认为这样的库必须已经存在,甚至可以使用标准拼写。但是我在Haskell库中找不到这样的类型类。 我找到了Data.Function模块,但是没有类型类-只有一些常见的函数也可以从Prelude中获得。 那么-为什么没有函数的类型类?是“仅仅是因为没有”还是“因为它没有您想象的那么有用”?还是这个想法存在根本性的问题? 到目前为止,我想到的最大可能的问题是,实际功能上的功能应用程序可能必须由编译器进行特殊处理,以避免出现循环问题-为了应用此功能,我需要应用功能应用程序功能,为此,我需要调用函数应用程序函数,然后执行此操作... 更多线索 示例代码显示我的目标... {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} -- In my first version, Doable only had the one argument f. This version -- seemed to be needed to support the UndoableOffset type. -- -- It seems …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.