问题标签 [haskell]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
exception - 如何在 Haskell 中捕获任意异常?
如何在 Haskell 中捕获异常?
function - 函数应用:这里为什么用$?
前段时间,我问了一个关于 $的问题,得到了有用的答案——事实上,我以为我理解了如何使用它。
看来我错了:(
此示例显示在教程中:
我一生都无法理解为什么在那里使用 $ ;ghci 也没有帮助我,因为即使我在那里进行的测试似乎也显示出与简单地省略 $ 的版本等价。有人可以为我澄清一下吗?
haskell - 有没有关于如何使用 Haskell monad 函数的好例子?
Haskell monad 函数不太好理解,在哪里可以找到使用示例?
haskell - 如何减少 Haskell 应用程序中的内存使用量?
我是函数式编程的新手,现在学习 Haskell。作为练习,我决定为一维线性扩散方程实施显式欧拉方法。虽然下面的代码可以正常工作,但我对它的性能并不满意。事实上,我关心的是内存消耗。我相信它与惰性评估有关,但无法弄清楚如何减少它的内存使用量。
该算法的思想非常简单,用命令式的术语来说清楚:它需要一个“数组”,并为每个内部点添加一个值,该值是由点本身和它的值的组合计算得出的。邻居。边界点是特殊情况。
所以,这是我的 Euler1D.hs 模块:
还有一个简单的 Main.hs:
为了比较,我还写了一个纯 C 实现。
现在,如果我尝试为足够大的数组运行 Haskell 实现n
,我有:
相比之下,C 版本快了近两个数量级:
编辑:这种比较并不公平,因为 Haskell 版本是使用分析标志编译的,而 C 不是。如果我编译两个程序都带有
-O2
和不带分析标志,我可以增加n
. 在这种情况下time ./eulerhs 1000000
需要 0m2.236s,而time ./eulerc 1000000
只需要 0m0.293s。所以问题仍然存在于所有优化中并且没有分析,它只是偏移。我还想指出,Haskell 程序的内存分配似乎与
n
. 这可能没问题。
但最糟糕的是内存要求。我的 Haskell 版本需要超过 100MB(我估计 C 中的最低限度是4MB)。我认为这可能是问题的根源。根据分析报告,该程序在 GC 上花费了 85% 的时间,并且
看到这么贵,我很makeu0
惊讶。我认为这是由于它的惰性评估(如果它的 thunk 保留在内存中直到结束)。stepEuler
我尝试了以下更改Main.hs
:
但没有注意到任何区别。我不知道如何减少stepEuler
. 所以,我的问题是:
- Haskell 有没有办法严格地构建列表/做列表推导?在这种情况下,让它保持懒惰没有任何好处。
- 在这种情况下,如何减少总体内存使用量?我想,我必须做一些严格的事情,但看不到是什么。换句话说,如果我必须放一些
seq
s和刘海,在哪里以及为什么? - 最后,最重要的是,识别这种昂贵结构的最佳策略是什么?
我确实在Real World Haskell中阅读了有关分析和优化的一章,但目前尚不清楚我如何准确地决定什么应该严格,什么不应该。
请原谅我这么长的帖子。
EDIT2:正如 A. Rex 在评论中所建议的那样,我尝试在 valgrind 中运行这两个程序。这就是我观察到的。对于 Haskell 程序(
n
=200000),它发现:malloc/free:33 次分配,30 次释放,分配了 84,109 字节。...检查了 55,712,980 个字节。
对于 C 程序(经过小修复):
malloc/free:2 次分配,2 次释放,分配了 3,200,000 字节。
因此,看起来虽然 Haskell 分配了小得多的内存块,但它经常这样做,并且由于垃圾收集的延迟,它们会累积并保留在内存中。所以,我还有一个问题:
- 是否有可能在 Haskell 中避免大量的小分配?基本上,要声明,我需要处理整个数据结构,而不仅仅是按需处理它的片段。
haskell - 何时在 Haskell 中利用类型推断?
我很好奇有经验的 Haskell 程序员在实践中真正使用类型推断的频率。我经常看到它被称赞为优于某些其他语言所需的始终显式声明的优势,但出于某种原因(也许只是因为我是新手),几乎一直“感觉”编写类型签名是正确的。 .而且我敢肯定在某些情况下它确实是必需的。
一些有经验的 Haskellers(Haskellites?Haskellizers?)可以提供一些输入吗?
haskell - 函数式语言的显着特征
众所周知,所有函数式语言都共享一些基本属性,例如将函数用作程序的基本构建块,并具有所有后果,例如使用递归而不是迭代。但是,也存在一些根本性差异。Lisp 对 Lisp 代码和数据使用单一表示,而 ML 没有 ML 代码的标准表示。Erlang 有一个内置的基于actor的并发。Haskell 有单子。Haskell 在静态类型系统中区分了纯函数和不纯函数;机器学习没有。
其他函数式语言(Clojure、F#、Arc 等)之间有哪些显着的根本区别?基本我的意思是影响你用这种语言开发的方式,而不是例如它是否与一些广泛传播的运行时集成。
emacs - 用于 Haskell 等静态强类型语言和 Common LIsp 等动态(强)语言
我正在使用 Lisp 方言,但也学习了一些 Haskell。它们有一些相似之处,但在 Common Lisp 中的主要区别似乎是您不必为每个函数、参数等定义类型,而在 Haskell 中则需要。此外,Haskell 主要是一种编译语言。运行编译器以生成可执行文件。
我的问题是,在不同的应用程序或用途中,像 Haskell 这样的语言可能比像 Common Lisp 这样更动态的语言更有意义。例如,似乎 Lisp 可以用于更多的底层编程,例如构建网站或 GUI,其中 Haskell 可以用于更需要编译时间检查的地方,例如构建 TCP/IP 服务器或代码解析器。
流行的 Lisp 应用程序:Emacs
流行的 Haskell 应用程序:PUGS Darcs
你同意吗,有没有这方面的研究?
compiler-construction - Is Scalas/Haskells parser combinators sufficient?
I'm wondering if Scalas/Haskells parser combinators are sufficient for parsing a programming language. More specifically the language MiniJava. I'm currently reading compiller construction and jflex and java cup is quite painful to work with so I'm wondering if I could/should use parser combinators instead. The MiniJava syntax is very small. MiniJavas BNF: http://www.cambridge.org/us/features/052182060X/grammar.html
haskell - C++ 的 std::bind2nd 是否有内置的 Haskell 等价物?
我缺少的是部分应用函数的第二个参数而不是第一个参数的能力。当我想将函数传递给 map 之类的东西时,这特别有用,但不必每次都为它编写 lambda。
我为此编写了自己的函数(定义如下,以防万一确实没有任何内置函数,并且其他人对此感到好奇),但我真的很想知道 Prelude 中是否已经存在为此成语,因为我更喜欢重用而不是重新发明。
这是我的定义和一个简单的例子:
haskell - 类定义中的管道是什么意思?
上面的管道是什么意思?片段来自这里。