Questions tagged «haskell»

Haskell是一种功能性编程语言,具有强大的静态类型,惰性评估,广泛的并行性和并发支持以及独特的抽象功能。

3
为什么ghci desugar类型列表和类型族?可以有选择地禁用它吗?
我试图使我的库的ghci显示类型尽可能直观,但是在使用更高级的类型功能时遇到了很多困难。 假设我在文件中有以下代码: {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE TypeOperators #-} import GHC.TypeLits data Container (xs::[*]) = Container 我将其加载到ghci中,然后键入以下命令: ghci> :t undefined :: Container '[String,String,String,String,String] 不幸的是,ghci给了我一个难看的外观: :: Container ((':) * String ((':) * String ((':) * String ((':) * String ((':) * String ('[] *)))))) ghci删除了用于类型级别字符串的糖。有什么方法可以防止ghci这样做并给我漂亮的版本吗? 在相关说明中,可以说我创建了一个类型级别的Replicate函数 …
93 haskell  types  ghci 



9
函数式编程语言如何工作?
如果函数式编程语言无法保存任何状态,它们将如何做一些简单的事情,例如从用户那里读取输入内容?他们如何“存储”输入(或存储与此相关的任何数据?) 例如:这个简单的C语言将如何转换为Haskell这样的函数式编程语言? #include<stdio.h> int main() { int no; scanf("%d",&no); return 0; } (我的问题受到了这篇出色的文章的启发:“名词的王国中的执行”。阅读它使我对面向对象的编程到底是什么,Java如何以一种极端的方式实现它以及函数式编程语言如何成为一种更好的理解。对比。)


3
mtl,transformers,monads-fd,monadLib和选择的悖论
黑客有几个用于monad变压器的软件包: mtl:Monad变压器库 变压器:混凝土函子和单子变压器 monads-fd:Monad类,使用函数依赖项 monads-tf:Monad类,使用类型族 monadLib:monad变压器的集合。 mtl-tf:使用类型族的Monad转换器库。 mmtl:模块化Monad变压器库 mtlx:具有类型索引的Monad转换器库,提供“免费”副本。 compose-trans:可组合的monad变压器 (也许我错过了一些) 我们应该使用哪一个? mtl是Haskell平台中的mtl,但我一直在reddit上听到它很不酷的消息。 但是无论如何,选择有什么不好,这不是一件好事吗? 好吧,我看到例如数据访问器的作者必须如何做出所有这些选择以迎合流行的选择: data-accessor-monadLib库:monadLib的monad的访问器函数 data-accessor-monads-fd库:使用访问器访问monads-fd State monad类中的状态 data-accessor-monads-tf库:使用访问器访问monads-tf State monad类型族中的状态 data-accessor-mtl库:使用访问器访问mtl State monad类中的状态 data-accessor-transformers库:使用Accessor来访问变形金刚状态monad中的状态 我想如果继续进行下去,例如几个竞争的Arrow软件包不断发展,我们可能会看到类似的东西:spoonklink-arrows-transformers,spoonklink-arrows-monadLib,spoonklink-tfArrows-transformers,spoonklink-tfArrows-monadLib,... 然后,我担心如果spoonklink被派生了,黑客程序将耗尽磁盘空间。:) 问题: 为什么会有这么多的monad变压器套件? 为什么[考虑]不酷? 主要区别是什么? 这些看似竞争的软件包中的大多数由Andy Gill编写,由Ross Paterson维护。这是否意味着这些软件包没有竞争,而是以某种方式协同工作?Andy和Ross是否认为自己的任何软件包都已过时? 您和我应该使用哪一个?

3
这段模糊的Haskell代码如何工作?
在阅读https://en.uncyclopedia.co/wiki/Haskell(并忽略所有“令人反感”的东西)时,我偶然发现了以下混淆代码: fix$(<$>)<$>(:)<*>((<$>((:[{- thor's mother -}])<$>))(=<<)<$>(*)<$>(*2))$1 当我在ghci(Data.Function和导入后Control.Applicative)中运行该代码时,ghci输出2的所有幂的列表。 此段代码如何工作?
91 haskell 

3
状态,ST,IORef和MVar之间的区别
我正在48小时内完成“ 编写自己的计划”(我大约需要85小时),并且已经完成了有关添加变量和赋值的部分。本章在概念上有很大的跳跃,我希望它分两步完成,并且在两者之间进行了很好的重构,而不是直接跳转到最终解决方案。无论如何… 我迷路了一些不同类的,似乎达到相同的目的:State,ST,IORef,和MVar。文本中提到了前三个,而后三个似乎是很多有关前三个的StackOverflow问题的首选答案。它们似乎在连续调用之间都带有状态。 这些分别是什么,它们又有何不同? 这些句子尤其没有意义: 相反,我们使用一种称为状态线程的功能,让Haskell为我们管理聚合状态。这使我们能够像使用任何其他编程语言一样对待可变变量,使用函数来获取或设置变量。 和 IORef模块使您可以在IO monad中使用状态变量。 所有这些使这条线变得type ENV = IORef [(String, IORef LispVal)]混乱-为什么第二条IORef呢?如果我改写会type ENV = State [(String, LispVal)]怎样?

4
Haskell的幂
谁能告诉我为什么Haskell Prelude定义两个单独的求幂函数(即^和**)?我认为类型系统应该消除这种重复。 Prelude> 2^2 4 Prelude> 4**0.5 2.0

15
用Haskell编写Haskell解释器
一个经典的编程练习是用Lisp / Scheme编写Lisp / Scheme解释器。可以利用完整语言的功能为该语言的子集生成解释器。 Haskell有类似的练习吗?我想使用Haskell作为引擎来实现Haskell的子集。当然可以做到,但是有没有在线资源可供参考? 这是背景故事。 我正在探索使用Haskell作为语言来探索我正在教授的“ 离散结构”课程中的某些概念的想法。在本学期,我选择了米兰达语,这是一种较小的语言,启发了Haskell。Miranda完成了大约90%的工作,但是Haskell完成了大约2000%的工作。:) 所以我的想法是创建一种语言,该语言具有我想要的Haskell的功能,而不允许其他所有功能。随着学生的进步,一旦他们掌握了基础知识,我就可以有选择地“打开”各种功能。 教学“语言水平”已成功用于教授Java和Scheme。通过限制他们可以做的事情,可以防止他们在他们仍在掌握要教的语法和概念的同时向自己开枪。并且您可以提供更好的错误消息。

2
Repa数组上的并行mapM
在我最近的工作有Gibbs sampling,我已经作出了巨大的使用的RVar,在我看来,提供随机数生成近乎理想的接口。遗憾的是,由于无法在地图中使用单子动作,因此我无法使用Repa。 尽管显然单峰映射一般无法并行化,但在我看来,这RVar至少可以是一个可以安全地并行化效果的单子映射示例(至少在原理上;我对的内部运作并不十分熟悉RVar) 。即,我想写类似下面的东西, drawClass :: Sample -> RVar Class drawClass = ... drawClasses :: Array U DIM1 Sample -> RVar (Array U DIM1 Class) drawClasses samples = A.mapM drawClass samples 这里A.mapM看起来是这样的, mapM :: ParallelMonad m => (a -> m b) -> Array r sh a -> m (Array r …

3
当前的功能性反应式编程实现的状态如何?
我正在尝试可视化Haskell中的一些简单的自动物理系统(如摆锤,机器人手臂等)。通常,这些系统可用方程式来描述 df/dt = c*f(t) + u(t) 其中u(t)代表某种“智能控制”。这些系统看起来非常适合于功能性反应式编程范例。 因此,我抓住了保罗·休达(Paul Hudak)的著作《 The Haskell School of Expression》,发现那里展示的领域特定语言“ FAL”(用于功能动画语言)实际上对我的简单玩具系统非常满意(尽管有些功能值得注意integrate,似乎对于有效使用而言有点懒惰,但很容易修复)。 我的问题是,对于当今更高级甚至是实际的应用程序,最成熟,最新,维护良好,性能调整的替代方案是什么? 该Wiki页面列出了Haskell的几个选项,但是我不清楚以下方面: Conal Eliott的项目(据我所知)是这种编程范例的发明者之一,它的“反应性”状态看起来有些陈旧。我喜欢他的代码,但也许我应该尝试其他更多的替代方法?就语法/性能/运行时稳定性而言,它们之间的主要区别是什么? 引用2011年的一项调查的第6节,“ ... FRP实施在性能上仍然不够有效或可预测,无法在需要延迟保证的域中有效使用... ”。尽管该调查建议了一些有趣的可能的优化方法,但考虑到FRP已经存在了15年以上,我给人的印象是,至少在几年内,此性能问题可能非常或什至固有地很难解决。这是真的? 调查的同一位作者在他的博客中谈论“时间泄漏” 。问题是FRP特有的,还是使用纯非严格语言进行编程时通常遇到的问题?您是否发现过长时间稳定基于FRP的系统太难了吗? 这仍然是研究水平的项目吗?诸如工厂工程师,机器人工程师,财务工程师等人员实际上是否正在使用它们(以适合他们需求的任何语言)? 尽管我个人更喜欢Haskell实现,但我愿意接受其他建议。例如,拥有一个Erlang实现会特别有趣---那么拥有一个智能的,自适应的,自学习的服务器进程将非常容易!

7
Haskell的严格点是什么?
我们都知道(或应该知道)Haskell默认是懒惰的。在必须评估之前,不会评估任何内容。那么什么时候必须对某些东西进行评估?在某些方面,Haskell必须严格。我称这些为“严格点”,尽管这个特定术语没有我想象的那么广泛。据我说: Haskell中的减少(或评估) 仅在严格点进行。 所以,问题是:什么,准确地说,是Haskell的严格点?我的直觉说main,seq/爆炸模式,模式匹配以及IO通过执行的任何操作main都是主要的严格要求,但是我真的不知道为什么知道这一点。 (另外,如果他们不叫“严点”,什么是他们叫什么名字?) 我想一个很好的答案将包括有关WHNF的一些讨论。我也想像它可能会影响lambda演算。 编辑:关于此问题的其他想法。 正如我对这个问题的思考一样,我认为在严格性点的定义中添加一些内容会更加清晰。严格点可以具有变化的上下文和变化的深度(或严格性)。回到我的定义“ Haskell的减少仅在严格性点发生”,让我们在该定义中添加以下条款:“严格性点仅在评估或减少其周围上下文时触发。” 因此,让我尝试让您开始我想要的答案。main是严格的一点。它被专门指定为上下文的主要严格要点:程序。在main评估程序(的上下文)时,将激活main的严格点。Main的深度最大:必须对其进行充分评估。Main通常由IO操作组成,这些操作也是严格意义上的要点,其上下文是main。 现在您尝试:seq用这些术语讨论和模式匹配。解释功能应用的细微差别:它有多严格?怎么不行 那deepseq呢 let和case陈述?unsafePerformIO?Debug.Trace?顶级定义?严格的数据类型?爆炸图案?等等,仅用seq或模式匹配就可以描述其中的多少项?


1
为什么此Haskell代码在-O下运行速度较慢?
这件作品的Haskell代码运行多速度较慢-O,但-O应无危险。谁能告诉我发生了什么事?如果很重要,则尝试解决此问题,并使用二进制搜索和持久性段树: import Control.Monad import Data.Array data Node = Leaf Int -- value | Branch Int Node Node -- sum, left child, right child type NodeArray = Array Int Node -- create an empty node with range [l, r) create :: Int -> Int -> Node create l r | l …

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.