我想跟踪GC花费了多少时间以及收集了多少内存,但不是通过分析GC日志(即分析我从-XX获得的内容:+ PrintGCWhatever).
我发现我可以使用Sun的ManagementFactory来获取一个GarbageCollectorMXBean,它可以给我一些包含内存信息的GCInfo对象,但我不能保证我可以通过这个意思收集所有 GC.
有人知道在代码中这样做的方法吗?
我在伊德里斯写了以下命题:
total
plusOneCommutes : (n : Nat) -> (m : Nat) -> (n + S m = S n + m)
plusOneCommutes Z k = Refl
plusOneCommutes (S k) j =
let inductiveHypothesis = plusOneCommutes k j in
rewrite inductiveHypothesis in Refl
Run Code Online (Sandbox Code Playgroud)
使用Prelude.Nat源代码的灵感,我理解为什么使用递归调用(在第二种情况下)作为归纳假设来证明这种情况是有意义的.但是,通过重写漏洞的细节,我并不真正了解发生了什么以及为什么这样做.
如果我写:
plusOneCommutes (S k) j = ?hole
Run Code Online (Sandbox Code Playgroud)
我从编译器中得到以下内容:
- + HolyGrail.hole [P]
`-- k : Nat
j : Nat
------------------------------------------------------
HolyGrail.hole : S (plus k (S j)) = S (S (plus k j))
Run Code Online (Sandbox Code Playgroud)
这看起来并不正确.根据plusOneCommutes …
我已经读过好几次了,好的做法是系统地标记Haskell中严格的记录字段,例如代替
data Foo = Foo { bar :: Bar, quux :: Quux }
Run Code Online (Sandbox Code Playgroud)
做
data Foo = Foo { bar :: !Bar, quux :: !Quux}
Run Code Online (Sandbox Code Playgroud)
例如,以下是《Haskell Programming from First Principles》(第1134页)的引文:
遵循的一个好规则是脊椎懒惰,叶子严格!
我(认为我)了解严格性是什么,两者之间有什么区别。我不明白的是,为什么后者要系统地进行?
我为一种理解C风格单行注释的小语言编写了一个语法,例如.
// this is a comment
Run Code Online (Sandbox Code Playgroud)
这是我使用antlr v3.0.1为这种语言编写的语法片段
SINGLELINE_COMMENT
: '/' '/' (options {greedy=false;} : ~('\r' | '\n'))* ('\r' | '\n' )+ {$channel=HIDDEN;};
WS : (' '|'\r'|'\t'|'\u000C'|'\n')+ {$channel=HIDDEN;};
Run Code Online (Sandbox Code Playgroud)
除了当注释在脚本中的最后一个并且没有终止NL/CR时,我得到了来自antlr的恼人消息(在运行时):这几乎是有效的.
line 1:20 required (...)+ loop did not match anything at character '<EOF>'
Run Code Online (Sandbox Code Playgroud)
我怎样才能摆脱这条消息?我尝试EOF在(..)+表达式中添加令牌,但这不起作用.
在我的应用程序中,我存储并加载数据库中的对象(当前是本地平面文件...).这些对象都来自类型系列,Event a并且都可以进行序列化ByteString.但是a在类型家庭中可能会有所不同......
这是基类声明:
class BusinessModel a where
data Event a :: *
apply :: a -> Event a -> a
Run Code Online (Sandbox Code Playgroud)
一个示例实现,以及所需的类型:
data User = User { userId :: UserId, userName :: Text } deriving (Eq, Show, Read, Generic)
instance ToJSON User
instance FromJSON User
type UsersView = M.Map UserId User
instance BusinessModel UsersView where
data Event UsersView = NoEvent -- ^A no-op event
| UserRegistered User
deriving (Eq, Show, Read, Generic)
apply v (UserRegistered …Run Code Online (Sandbox Code Playgroud) 我试图在以下方式中实现(de)Haskell中数据结构的序列化:
我过去以一种我发现不满意的方式实现了这种机制:代码中有很多重复,因为它需要遍历整个结构,即使只有一个叶子发生变化,处理各种版本的代码也是不可组合的.
我正在寻找的东西就像VCS中的补丁流一样:在每次版本更改时,我只需要编写代码来处理特定的更改(例如,某些字段从转换Text为Int,有一个新字段,删除某些字段...)并在已知版本中给出一些序列化的字节块,该load函数应用所有补丁来检索有效的数据结构.
我试图在这些行上编写一些代码,但是无法以我正在寻找的方式获得可组合的东西(我甚至没有解决和类型的问题......).这是我的尝试:
data Versioned (v :: Nat) a where
(:$:) :: (a -> b) -> Versioned v a -> Versioned v b
(:*:) :: Versioned v (a -> b) -> Versioned v a -> Versioned v b
Atom :: Get a -> Versioned v a
Cast :: Versioned v' a -> Versioned v a
Run Code Online (Sandbox Code Playgroud)
我们的想法是以一种可以应用最小变化的方式来实现一个应用程序结构.
这似乎只能使用某种形式的Generic反序列化机制:将字节反序列化为通用形式,然后应用变换器链来达到满足当前的形状.
对解决方案的任何暗示都是最有帮助的.
2017年2月13日
我的问题可以分为两个子问题:
问题1.产生以下(非编译代码):
-- | …Run Code Online (Sandbox Code Playgroud) 我认为所有内容都在标题中,但要提供更多背景信息.我们有两个70多个软件包,它们的编译时间差异很大:一个是另一个需要两倍的时间(不考虑并行化).我想知道哪些模块花费的时间最多,以便更好地了解造成这种差异的原因.
我想在Haskell中编写一个嵌入式DSL,我可以用另一种语言生成代码(即Python,但这与问题无关).有很多不同的方法可以做到这一点,比如使用我所知道的基于Free monad的解释器或无标记解释器.但是我所知道的任何方法似乎都无法捕获函数定义,这种定义很有意义,但也非常有限.
我的问题是:如何将实际的Haskell函数嵌入到DSL中?我们的想法是将Haskell函数定义捕获为类似Lam var body构造函数的东西,它看起来像:
data Var = Var ... -- use DeBruijn numbering?
data Expr repr = Lam Var repr
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望能够写出如下内容:
foo :: Expr repr
foo = \ n -> n + n * 12
Run Code Online (Sandbox Code Playgroud)
然后能够以Expr各种方式解释这一点,包括生成外国代码.
我用https://hackage.haskell.org/package/data-reify进行了实验,它提供了一些捕获函数的技术,但没有达到很远.我正在寻找的是什么?
我有一个震动构建(版本 0.16.4),它从Dockerfiles 和其他支持文件中构建了很多 docker 图像。我想将所有这些构建在一个“规则”中,其输出将是一个 docker 图像。我已经阅读了如何在 Shake 中定义计时器规则关于shake 中的自定义规则,但这并没有解释如何定义自己的输出。
我想表达类似的东西
Image "foo" "latest" %> \ img -> do
need [ ... ]
buildDockerImage "docker/foo" img
Image "bar" "latest" %> \ img ->
needImage "foo" "latest"
...
Run Code Online (Sandbox Code Playgroud)
然后将图像作为依赖项进行抖动跟踪。我已经在旧版本的shake中实现了那种东西,但我对如何在> 0.16中做到这一点一无所知。
更新:
我已经尝试过这个,遵循https://hackage.haskell.org/package/shake-0.17.3/docs/Development-Shake-Rule.html的指导方针
newtype Repo = Repo String
deriving (Show, Eq, Hashable, Binary, NFData)
newtype Tag = Tag String
deriving (Show, Eq, Hashable, Binary, NFData)
newtype SHA256 = SHA256 String
deriving (Show, Eq, …Run Code Online (Sandbox Code Playgroud)