Questions tagged «haskell»

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

3
在复制其余字段时分配记录中单个字段的简便方法?
假设我有以下记录ADT: data Foo = Bar { a :: Integer, b :: String, c :: String } 我想要一个接受记录并返回记录(相同类型)的函数,其中除一个字段外,所有字段的值都与作为参数传递的值相同,如下所示: walkDuck x = Bar { a = a x, b = b x, c = lemonadeStand (a x) (b x) } 上面的方法有效,但是对于具有更多字段(例如10)的记录,创建这样的函数将需要进行很多输入,我觉得这是不必要的。 有没有那么简单的乏味方法?
118 haskell  record 

4
对于具有数百万个像素的2D,未装箱像素阵列,建议使用哪种Haskell表示形式?
我想解决Haskell中的一些图像处理问题。我正在处理具有数百万个像素的双色调(位图)和彩色图像。我有几个问题: 凭什么我要选择Vector.Unboxed和UArray?它们都是未装箱的数组,但Vector抽象似乎广为宣传,尤其是在循环融合方面。是Vector总是更好?如果不是,我什么时候应该使用哪种表示形式? 对于彩色图像,我希望存储三位16位整数或三位单精度浮点数。为此,使用Vector还是UArray更容易使用?表现更好? 对于双色调图像,每个像素仅需要存储1位。是否有预定义的数据类型可以通过将多个像素打包到一个单词中来帮助我,还是我自己一个人? 最后,我的数组是二维的。我想我可以处理表示形式为“数组数组”(或向量的向量)带来的额外间接,但我更喜欢具有索引映射支持的抽象。谁能推荐标准库或Hackage中的任何内容? 我是一个函数式程序员,不需要突变:-)

5
Haskell:在哪里与让
我是Haskell的新手,我对Where vs. Let感到非常困惑。它们似乎都提供了相似的目的。我已阅读之间的一些比较哪里和Let但是我很难辨别何时使用它们。有人可以提供一些背景信息,也可以提供一些示例来说明何时使用另一种方法吗? 在哪里与让 甲where子句只能在一个函数定义的电平来定义。通常,这与let定义范围相同。唯一的区别是使用防护装置的时间。该where条款的范围涵盖了所有保护措施。相反,let表达式的范围仅是当前函数子句和保护符(如果有)。 Haskell备忘单 该哈斯克尔维基是非常详细,并提供各种案件,但它使用的假设的例子。我觉得对于初学者来说,其解释太简短了。 Let的优点: f :: State s a f = State $ \x -> y where y = ... x ... Control.Monad.State 将不起作用,因为where是指与f =匹配的模式,其中范围内没有x。相反,如果您从let开始,那么您将不会有麻烦。 Haskell Wiki关于Let的优势 f :: State s a f = State $ \x -> let y = ... x ... in y …
117 haskell  keyword  where  let 

3
什么是最好的Haskell库来使程序可运行?[关闭]
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow 的主题。 5年前关闭。 改善这个问题 如果我要将某个程序投入生产,则需要将该程序做几件事才能使其“可操作”-即,工程师和操作人员都可以以一种可测量且可验证的方式来运行和维护该程序。出于我的目的,已实施的程序必须: 能够登录多个级别(例如:调试,警告等)。 能够收集和共享有关程序正在执行的工作类型以及该工作需要花费多长时间的度量标准/统计信息。理想情况下,收集的度量可以以与常用的监视工具(例如Ganglia)兼容的格式使用,或者可以被忽略。 是可配置的,理想情况下是通过这样的系统进行的:该系统允许更新正在运行的程序中配置的属性,而无需重新启动所述程序。 可重复地部署到远程服务器。 在Scala世界中,有很好的库可以处理至少前三个需求。例子: Logula用于记录。 指标或鸵鸟,用于收集和报告指标。 Configgy或Fig进行配置。 至于部署,在Scala世界中采取的一种方法是将组成程序的字节码和库与assembly-sbt等捆绑在一起,然后使用Capistrano之类的工具将生成的捆绑(“胖JAR”)推送到远程服务器通过SSH并行执行命令。这不是必须使用特定于语言的工具的问题,但是我很好奇Haskell社区中是否存在这样的工具。 可能有Haskell库提供了我上面描述的特征。我想知道哪些可用的库被认为是“最好的”;也就是说,这是Haskell社区中常用的最成熟,维护最完善的示例,并且是Haskell最佳做法的典范。 如果还有其他使Haskell代码“投入生产”的库,工具或实践,我也很想知道这些。
115 logging  haskell  metrics 

1
尽管只有22Mb的总内存使用量,Haskell线程还是会发生堆溢出?
我正在尝试并行化光线追踪器。这意味着我有很长的小型计算清单。Vanilla程序在特定场景上运行需要67.98秒,总内存使用量为13 MB,生产率为99.2%。 在我的第一次尝试中,我使用parBuffer了缓冲区大小为50 的并行策略。我之所以选择parBuffer它,是因为它仅在消耗火花时才通过列表,并且不会像这样强行parList使用列表的主干,因为它将消耗大量内存。因为列表很长。使用-N2,它的运行时间为100.46秒,总内存使用量为14 MB,生产率为97.8%。火花信息是:SPARKS: 480000 (476469 converted, 0 overflowed, 0 dud, 161 GC'd, 3370 fizzled) 大量的冒泡火花表示火花的粒度太小,因此接下来我尝试使用策略parListChunk,该策略将列表分成多个块并为每个块创建一个火花。块大小为时,我得到了最好的结果0.25 * imageWidth。该程序耗时93.43秒,总内存使用量为236 MB,生产率为97.3%。火花信息为:SPARKS: 2400 (2400 converted, 0 overflowed, 0 dud, 0 GC'd, 0 fizzled)。我相信更多的内存使用是因为parListChunk强制列表的脊椎。 然后,我尝试编写自己的策略,将列表懒散地划分为多个块,然后将这些块传递给parBuffer并连接结果。 concat $ withStrategy (parBuffer 40 rdeepseq) (chunksOf 100 (map colorPixel pixels)) 耗时95.99秒,总内存使用量为22MB,生产率为98.8%。在所有火花都已转换并且内存使用率低得多的意义上说,这是成功的,但是速度并没有提高。这是事件日志配置文件的一部分的图像。 如您所见,由于堆溢出,线程正在停止。我尝试添加+RTS -M1G,这将默认堆大小一直增加到1Gb。结果没有改变。我读到Haskell主线程会在堆栈溢出时使用堆中的内存,因此我也尝试增加默认堆栈大小,+RTS -M1G -K1G但这也没有影响。 还有什么我可以尝试的吗?我可以根据需要发布有关内存使用情况或事件日志的更详细的分析信息,我没有全部包括在内,因为这是很多信息,我认为没有必要包括所有信息。 编辑:我正在阅读有关Haskell …


1
为什么Haskell的“不执行任何操作”功能id会占用大量内存?
Haskell具有一个标识函数,该函数不变地返回输入。定义很简单: id :: a -> a id x = x 所以为了娱乐,这应该输出8: f = id id id id id id id id id id id id id id id id id id id id id id id id id id id main = print $ f 8 几秒钟后(根据任务管理器,大约有2 gb的内存),编译将失败ghc: out of …
112 haskell  ghc 

10
Java的接口和Haskell的类型类:区别和相似之处?
当我学习Haskell时,我注意到它的type class,这应该是源自Haskell的伟大发明。 但是,在Wikipedia页面上,类型为class: 程序员通过指定一组函数或常量名称以及它们各自的类型来定义类型类,对于每个属于该类的类型,它们必须存在。 这似乎与Java的界面非常接近对我来说,(引用Wikipedia的Interface(Java)页面): Java编程语言中的接口是一种抽象类型,用于指定类必须实现的接口(在通用意义上)。 这两个看起来很相似:类型类限制类型的行为,而接口限制类的行为。 我想知道Haskell中的类型类和Java中的接口之间有什么区别和相似之处,或者根本上有区别吗? 编辑:我注意到什至haskell.org也承认它们是相似的。如果它们是如此相似(或者是?),那么为什么用此类炒作来处理类型class? 更多编辑:哇,这么多好答案!我想我必须让社区决定哪一个是最好的。但是,在阅读答案时,所有的人似乎都只是说:“ typeclass可以做很多事情,而interface不能或不必应付泛型”。我不禁想知道,接口有什么可以做而类型类不能做吗?另外,我注意到Wikipedia声称typeclass最初是在1989年的论文中发明的*“如何使ad hoc多态性减少ad hoc”,而Haskell仍处于摇篮中,而Java项目始于1991年并于1995年首次发布因此,也许不是typetype与接口类似,而是接口受typeclass影响?是否有任何文件/文件支持或反对?感谢所有答案,它们都非常有启发性! 感谢您的所有投入!

4
Haskell错误解析输入“ =”上的错误
我是Haskell的新手,开始ghci尝试后: f x = 2 * x 我获得了: <interactive>:1:4: parse error on input `=' 我不明白。 奇怪的是,它以前运行良好。我想我做错了Haskell的配置。重新安装ghc6无法解决问题。 有关信息,我使用Ubuntu 10.4,ghc6的版本为6.12.1-12
111 haskell 



17
Haskell有什么大惊小怪的?[关闭]
从目前的情况来看,这个问题不适合我们的问答形式。我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 8年前关闭。 我认识一些程序员,他们在一起时总是在谈论Haskell,因此在这里每个人似乎都喜欢这种语言。擅长Haskell似乎有点天才程序员的特点。 有人可以举一些Haskell的例子来说明为什么它如此优雅/优越吗?

4
Haskell:<*>的发音是什么?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 改善这个问题 您如何在Applicative类型类中发音这些函数: (&lt;*&gt;) :: f (a -&gt; b) -&gt; f a -&gt; f b (*&gt;) :: f a -&gt; f b -&gt; f b (&lt;*) :: f a -&gt; f b -&gt; f a (也就是说,如果他们不是操作员,那么他们会被称为什么?) 附带说明一下,如果您可以将其重命名pure为对非数学家更友好的名称,您会怎么称呼它?
109 haskell  operators 

5
Haskell的Prelude.read为什么不返回Maybe?
是否有充分的理由解释为什么Prelude.read是 read :: Read a =&gt; String -&gt; a 而不是返回Maybe值? read :: Read a =&gt; String -&gt; Maybe a 由于字符串可能无法解析为Haskell,因此后者会更自然吗? 甚至是Either String a,Left如果没有解析,原始的字符串在哪里,如果有Right则返回结果? 编辑: 我并不是想让别人为我写一个相应的包装器。只是想确保这样做是安全的。
108 parsing  haskell  types 

1
现在,现实世界中Haskell的哪些部分已过时或被视为不良做法?
在“ 真实世界” Haskell的第19章中,由于的变化,现在许多例子都失败了Control.Exception。 这使我认为,也许已经有6年了,这本书中的某些内容实际上已经过时了,不再值得研究了。我唯一的参考资料是《学好Haskell for Great Good》,虽然这是一本很棒的书,但与RWH相比,它更基础。 曾经读过这本书的任何人都可以就其中哪些部分不再相关提出建议吗?尤其是本书后半部分的章节,例如,软件事务存储器,并发编程,套接字编程等。 编辑:这与2008年12月出版的书的版本有关,这是迄今为止(2017年11月)唯一已知的版本

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.