小编sas*_*nin的帖子

Haskell数据类型的内存占用量

如何找到在Haskell中存储某些数据类型值所需的实际内存量(主要是使用GHC)?是否可以在运行时(例如在GHCi中)对其进行评估,还是可以从其组件中估算复合数据类型的内存要求?

在一般情况下,如果类型的存储需求ab已知的,什么是代数数据类型,如内存开销:

data Uno = Uno a
data Due = Due a b
Run Code Online (Sandbox Code Playgroud)

例如,这些值占用的内存中有多少字节?

1 :: Int8
1 :: Integer
2^100 :: Integer
\x -> x + 1
(1 :: Int8, 2 :: Int8)
[1] :: [Int8]
Just (1 :: Int8)
Nothing
Run Code Online (Sandbox Code Playgroud)

据我所知,由于垃圾收集延迟,实际的内存分配更高.由于惰性评估,它可能会有很大的不同(并且thunk大小与值的大小无关).问题是,给定数据类型,在完全评估时它的值会占用多少内存?

我发现:set +sGHCi中有一个选项可以查看内存统计信息,但目前尚不清楚如何估算单个值的内存占用量.

haskell memory-management ghc algebraic-data-types

120
推荐指数
2
解决办法
6992
查看次数

我应该使用GHC Haskell扩展吗?

在我学习Haskell时,我发现在现实代码中使用了很多语言扩展.作为初学者,我应该学会使用它们,还是应该不惜一切代价避免使用它们?我看到它破坏了与Haskell 98的兼容性,并且仅将代码限制为几乎GHC.但是,如果我在Hackage上浏览软件包,我发现大多数软件包都是GHC的.

那么,社区对使用语言扩展的态度是什么?

如果扩展的使用是可以的,我如何区分我可以"安全地"使用的扩展(那些可能成为下一个Haskell标准的一部分的扩展)与那些主要是"实验性"的扩展?例如,我认为-XDisambiguateRecordFields很好用,但未来很可能会得到支持吗?

haskell ghc

78
推荐指数
4
解决办法
5707
查看次数

非常简单,简洁易用的GUI编程"框架"

请列出允许快速编写GUI应用程序的GUI编程库,工具包,框架.我的意思是这样的

  • GUI完全以人类可读(和人类可写)的纯文本文件(代码)描述
  • 代码简洁(每个小部件/事件对有1或2行代码),适合脚本编写
  • 从代码中可以看出GUI的结构和操作(小部件和事件流的嵌套)
  • 隐藏有关如何构建GUI的详细信息(如mainloop,附加事件侦听器等)
  • 支持自动布局(vbox,hbox等)

正如答案所暗示的那样,这可以定义为声明性 GUI编程,但不一定是这样.任何方法都可以,如果它工作,易于使用和简洁.

有一些像这样的GUI库/工具包.它们列在下面.如果您发现缺少合格工具包,请扩展列表.指出项目是否是跨平台,成熟,活跃,并尽可能提供示例.

请使用此wiki 讨论开源项目.

这是到目前为止的列表(按字母顺序排列):

Fudgets

Fudgets是一个Haskell库.平台:Unix.状态:实验,但仍保持.一个例子:

  import Fudgets
  main = fudlogue (shellF "Hello" (labelF "Hello, world!" >+< quitButtonF))
Run Code Online (Sandbox Code Playgroud)

Fudgets示例截图
(来源:picamatic.com)

GNUstep文艺复兴

Renaissance允许用简单的XML描述GUI.平台:OSX/GNUstep.状态:GNUstep的一部分.以下示例:

<window title="Example">
  <vbox>
    <label font="big">
      Click the button below to quit the application
    </label>
    <button title="Quit" action="terminate:"/>
  </vbox>
</window> 
Run Code Online (Sandbox Code Playgroud)

文艺复兴时期的例子截图
(来源:picamatic.com)

HTML

基于HTML的GUI(HTML + JS).跨平台,成熟.可以完全在客户端使用.

寻找一个不错的"helloworld"示例.

HTML GUI示例
(来源:picamatic.com)

JavaFX的

JavaFX可用于独立(桌面)应用程序以及Web应用程序.不完全跨平台,尚未完全开源.状态:1.0发布.一个例子:

  Frame {
    content: Button {
      text: …
Run Code Online (Sandbox Code Playgroud)

scripting user-interface open-source declarative

60
推荐指数
3
解决办法
2万
查看次数

使用哪个Haskell XML库?

我看到Haskell中有一些XML处理库.

  • HaXml似乎是最受欢迎的(根据dons)
  • HXT似乎是最先进的(但由于箭头也是最难学的)
  • xml似乎只是基本的解析器
  • HXML似乎被抛弃了
  • tagsoup和tagchup
  • libXML和libXML SAX绑定

那么,如果我想要它,可以选择哪个库

  • 功能相当强大(从XML中提取数据并修改XML)
  • 可能会在未来的很长一段时间内得到支持
  • 成为"社区选择"(默认选择)

虽然上面的大部分内容似乎足以满足我目前的需求,但是选择其中一个而不是其他需求的原因是什么?

UPD 20091222:

关于许可证的一些注意

xml comparison haskell

60
推荐指数
3
解决办法
1万
查看次数

如何减少Haskell应用程序中的内存使用量?

我是函数式编程的新手,现在学习Haskell.作为练习,我决定实现一维线性扩散方程的显式欧拉方法.虽然下面的代码工作正常,但我对它的性能并不满意.事实上,我关心的是内存消耗.我相信它与懒惰评估有关,但无法弄清楚如何减少其内存使用量.

算法的想法非常简单,用命令性的术语表达:它采用一个"数组",并且每个内部点都添加一个值,该值是作为点本身和其中的值的组合计算的.邻居.边界点是特殊情况.

所以,这是我的Euler1D.hs模块:

module Euler1D
( stepEuler
, makeu0
) where

-- impose zero flux condition
zeroflux :: (Floating a) => a -> [a] -> [a]
zeroflux mu (boundary:inner:xs) = [boundary+mu*2*(inner-boundary)]

-- one step of integration
stepEuler :: (Floating a) => a -> [a] -> [a]
stepEuler mu u@(x:xs) = (applyBC . (diffused mu)) u
    where
          diffused mu (left:x:[]) = []    -- ignore outer points
          diffused mu (left:x:right:xs) = -- integrate inner points
                   (x+mu*(left+right-2*x)) : diffused mu (x:right:xs)
          applyBC inner …
Run Code Online (Sandbox Code Playgroud)

garbage-collection haskell functional-programming memory-management lazy-evaluation

32
推荐指数
2
解决办法
8390
查看次数

像SymPy一样的Haskell库?

我需要操作像1 + sqrt(3)这样的表达式,并进行加法,减法和除法等基本算法.我希望结果是某种规范形式,以便它可以用作地图中的键.由于舍入问题,将1 + sqrt(3)转换为浮点是不可行的.

我在Python中使用SymPy来完成这项任务.Haskell有一个等效的本机库吗?

haskell symbolic-math computer-algebra-systems

30
推荐指数
2
解决办法
5857
查看次数

如何在Common Lisp REPL中查看docstrings和其他符号信息?

我是CL的新手,我想学习如何阅读文档字符串并从REPL获取其他帮助信息.像help(symbol)Python中,或symbol?在IPython中,或:t:i在Haskell的GHCI.

所以,给定一个符号名称,我希望能够知道:

  • 它有什么样的价值,如果有的话(一个函数,一个变量,一个都没有)
  • 如果它是一个函数或一个宏,那么它的位置参数是什么
  • 如果它有文档字符串,请显示它
  • 它来自哪个包或文件或何时定义

我找到了(documentation '_symbol_ '_type_),但这不是我需要的.我需要知道的价值符号,势必(类型'function,'variable,'compiler-macro,等)之前,我可以使用documentation.然后它只返回docstring,它可能缺少或不足以使用该符号.

例如,在Lisp中,帮助mapcar不是很有用(CLisp的REPL):

> (documentation 'mapcar 'function)
NIL
Run Code Online (Sandbox Code Playgroud)

我希望能够看到这样的东西:

>>> map?
Type:       builtin_function_or_method
Base Class: <type 'builtin_function_or_method'>
String Form:    <built-in function map>
Namespace:  Python builtin
Docstring:
    map(function, sequence[, sequence, ...]) -> list

    Return a list of the results of applying the function to the items of
    the argument sequence(s).  If more than one …
Run Code Online (Sandbox Code Playgroud)

lisp documentation common-lisp read-eval-print-loop

25
推荐指数
2
解决办法
8946
查看次数

如何让Emacs自动重新加载TAGS文件?

当重新生成TAGS文件,并且我尝试访问Emacs(M- .)中的标记时,Emacs会询问我是否真的要重新读取该文件:

标签文件/路径/到/ TAGS已更改,读取新内容?(是还是不是)

yes每次都要进入.不太方便(M- . Enter y e s Enter在Vim中只有7个键可以按下2个).

如何配置Emacs以静默方式读取更新的TAGS,而不询问?

emacs

24
推荐指数
1
解决办法
3457
查看次数

发布补丁队列的Git方法是什么?

我习惯使用Mercurial mq扩展来维护上游的一组自定义补丁.它们可以作为除上游之外的单独存储库发布.现在在git我使用私有分支rebase,并且它运行良好,直到我想与其他人共享我的补丁.

在Mercurial中,补丁队列是一个独立的存储库,可以像往常一样发布.Bitbucket甚至提供了一个补丁队列功能,可以将它链接到父存储库.在Git中,如果我发布了一个包含我的补丁的私有分支,我就失去了再修改它们的能力(除非我破坏了合并),但补丁需要不时更新.

从我发现的另一个SO问题来看,在Git世界中,StGit被提议作为等价物mq.它在使用上类似mq,但如何使用StGit发布补丁队列?

(stg publish似乎是为了创建一个新的"合并友好"分支,而不是自己发布补丁)

在Git中发布补丁队列的其他方法有哪些?

git mercurial mercurial-queue

20
推荐指数
1
解决办法
2536
查看次数

在Clojure中表示总和类型(ab)的惯用方法

编辑.我现在的问题是:在静态类型语言中,通常使用什么惯用的Clojure结构而不是sum类型?到目前为止的共识:如果行为可以统一使用协议,否则使用标记对/映射,在前后条件下放置必要的断言.

Clojure提供了许多表达产品类型的方法:矢量,地图,记录......,但是如何表示总和类型,也称为标记的联合和变体记录?像Either a bHaskell或Either[+A, +B]Scala中的东西.

我想到的第一件事就是带有特殊标签的地图:{:tag :left :value a}但是(:tag value)如果不存在条件,那么所有的代码都将被污染并处理特殊情况......我想要确保的是,那:tag是永远存在的,而且只能取指定的值中的一个,和对应的值是一致的同类型/行为,不能nil,有一个简单的方法,看看我注意到在代码中所有的情况下照顾.

我可以想到一个宏defrecord,但是对于总和类型:

; it creates a special record type and some helper functions
(defvariant Either
   left Foo
   right :bar)
; user.Either

(def x (left (Foo. "foo")))   ;; factory functions for every variant
; #user.Either{:variant :left :value #user.Foo{:name "foo"}}
(def y (right (Foo. "bar")))  ;; factory functions check types
; SomeException...
(def y (right …
Run Code Online (Sandbox Code Playgroud)

types clojure discriminated-union

19
推荐指数
5
解决办法
3315
查看次数