如何找到在Haskell中存储某些数据类型值所需的实际内存量(主要是使用GHC)?是否可以在运行时(例如在GHCi中)对其进行评估,还是可以从其组件中估算复合数据类型的内存要求?
在一般情况下,如果类型的存储需求a
和b
已知的,什么是代数数据类型,如内存开销:
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 +s
GHCi中有一个选项可以查看内存统计信息,但目前尚不清楚如何估算单个值的内存占用量.
在我学习Haskell时,我发现在现实代码中使用了很多语言扩展.作为初学者,我应该学会使用它们,还是应该不惜一切代价避免使用它们?我看到它破坏了与Haskell 98的兼容性,并且仅将代码限制为几乎GHC.但是,如果我在Hackage上浏览软件包,我发现大多数软件包都是GHC的.
那么,社区对使用语言扩展的态度是什么?
如果扩展的使用是可以的,我如何区分我可以"安全地"使用的扩展(那些可能成为下一个Haskell标准的一部分的扩展)与那些主要是"实验性"的扩展?例如,我认为-XDisambiguateRecordFields很好用,但未来很可能会得到支持吗?
请列出允许快速编写GUI应用程序的GUI编程库,工具包,框架.我的意思是这样的
正如答案所暗示的那样,这可以定义为声明性 GUI编程,但不一定是这样.任何方法都可以,如果它工作,易于使用和简洁.
有一些像这样的GUI库/工具包.它们列在下面.如果您发现缺少合格工具包,请扩展列表.指出项目是否是跨平台,成熟,活跃,并尽可能提供示例.
请使用此wiki 仅讨论开源项目.
这是到目前为止的列表(按字母顺序排列):
Fudgets是一个Haskell库.平台:Unix.状态:实验,但仍保持.一个例子:
import Fudgets
main = fudlogue (shellF "Hello" (labelF "Hello, world!" >+< quitButtonF))
Run Code Online (Sandbox Code Playgroud)
(来源:picamatic.com)
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的GUI(HTML + JS).跨平台,成熟.可以完全在客户端使用.
寻找一个不错的"helloworld"示例.
(来源:picamatic.com)
JavaFX可用于独立(桌面)应用程序以及Web应用程序.不完全跨平台,尚未完全开源.状态:1.0发布.一个例子:
Frame {
content: Button {
text: …
Run Code Online (Sandbox Code Playgroud) 我看到Haskell中有一些XML处理库.
那么,如果我想要它,可以选择哪个库
虽然上面的大部分内容似乎足以满足我目前的需求,但是选择其中一个而不是其他需求的原因是什么?
UPD 20091222:
关于许可证的一些注意
我是函数式编程的新手,现在学习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
我需要操作像1 + sqrt(3)这样的表达式,并进行加法,减法和除法等基本算法.我希望结果是某种规范形式,以便它可以用作地图中的键.由于舍入问题,将1 + sqrt(3)转换为浮点是不可行的.
我在Python中使用SymPy来完成这项任务.Haskell有一个等效的本机库吗?
我是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) 当重新生成TAGS文件,并且我尝试访问Emacs(M- .)中的标记时,Emacs会询问我是否真的要重新读取该文件:
标签文件/路径/到/ TAGS已更改,读取新内容?(是还是不是)
我yes
每次都要进入.不太方便(M- . Enter y e s Enter在Vim中只有7个键可以按下2个).
如何配置Emacs以静默方式读取更新的TAGS,而不询问?
我习惯使用Mercurial mq
扩展来维护上游的一组自定义补丁.它们可以作为除上游之外的单独存储库发布.现在在git我使用私有分支rebase
,并且它运行良好,直到我想与其他人共享我的补丁.
在Mercurial中,补丁队列是一个独立的存储库,可以像往常一样发布.Bitbucket甚至提供了一个补丁队列功能,可以将它链接到父存储库.在Git中,如果我发布了一个包含我的补丁的私有分支,我就失去了再修改它们的能力(除非我破坏了合并),但补丁需要不时更新.
从我发现的另一个SO问题来看,在Git世界中,StGit被提议作为等价物mq
.它在使用上类似mq
,但如何使用StGit发布补丁队列?
(stg publish
似乎是为了创建一个新的"合并友好"分支,而不是自己发布补丁)
在Git中发布补丁队列的其他方法有哪些?
编辑.我现在的问题是:在静态类型语言中,通常使用什么惯用的Clojure结构而不是sum类型?到目前为止的共识:如果行为可以统一使用协议,否则使用标记对/映射,在前后条件下放置必要的断言.
Clojure提供了许多表达产品类型的方法:矢量,地图,记录......,但是如何表示总和类型,也称为标记的联合和变体记录?像Either a b
Haskell或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)haskell ×5
ghc ×2
clojure ×1
common-lisp ×1
comparison ×1
declarative ×1
emacs ×1
git ×1
lisp ×1
mercurial ×1
open-source ×1
scripting ×1
types ×1
xml ×1