我正在运行一个长期存在的Haskell程序,它可以保留大量内存.运行+RTS -N5 -s -A25M
(我的L3缓存的大小)我看到:
715,584,711,208 bytes allocated in the heap
390,936,909,408 bytes copied during GC
4,731,021,848 bytes maximum residency (745 sample(s))
76,081,048 bytes maximum slop
7146 MB total memory in use (0 MB lost due to fragmentation)
Tot time (elapsed) Avg pause Max pause
Gen 0 24103 colls, 24103 par 240.99s 104.44s 0.0043s 0.0603s
Gen 1 745 colls, 744 par 2820.18s 619.27s 0.8312s 1.3200s
Parallel GC work balance: 50.36% (serial 0%, perfect 100%)
TASKS: 18 (1 bound, 17 …
Run Code Online (Sandbox Code Playgroud) 如果我们得到一个<<loop>>
,那就意味着Haskell设法检测到一个无限循环.有没有办法让ghc告诉我们这个循环发生在哪里?似乎Haskell应该在某个地方拥有这些信息.
我正在尝试对一些Rust代码进行基准测试,但我无法弄清楚如何设置"ffast-math"选项.
% rustc -C opt-level=3 -C llvm-args='-enable-unsafe-fp-math' unrolled.rs
rustc: Unknown command line argument '-enable-unsafe-fp-math'. Try: 'rustc -help'
rustc: Did you mean '-enable-load-pre'?
Run Code Online (Sandbox Code Playgroud)
llvm-args='-ffast-math'
并且llvm-args='-fast'
也没有工作.我应该使用什么旗帜?
严格的状态monad定义使用:
m >>= k = State $ \s ->
case runState m s of
(a, s') -> runState (k a) s'
Run Code Online (Sandbox Code Playgroud)
但这仍然会泄漏记忆,因为a
并且没有s'
得到评估.例如,我们可能有一个函数f
将大对象作为输入并快速返回(a, s')
,但只要a
没有评估,输入f
就不能被GC.
一个可能的解决方案是f
返回seq a (a, s')
,但如果我们使用类似的东西MonadRandom
,这并不总是可能的,并且状态被封装起来f
.是否有这样定义的版本:
m >>= k = State $ \s ->
case runState m s of
(!a, !s') -> runState (k a) s'
Run Code Online (Sandbox Code Playgroud)
这已存在于任何地方的图书馆吗?
背景:我正在使用该nalgebra
库,我想创建一个代表多元正态分布的结构.数字和行类型由方形矩阵类型唯一确定,所以我想写这样的东西:
#[allow(non_snake_case)]
pub struct Multivar<M: SquareMat<N, V>> {
?: V,
?: M,
}
Run Code Online (Sandbox Code Playgroud)
如果我用Haskell中,我将指定之间的函数依赖M
和N
和V
.在Rust中最好的方法是什么?
似乎来自random-fu包的MonadRandom不是Functor,因为我得到的错误如下:
Could not deduce (Functor m) arising from a use of ‘_1’
from the context (MonadRandom m)
Run Code Online (Sandbox Code Playgroud)
我尝试添加以下代码:
instance Functor MonadRandom where
fmap = liftM
instance Applicative MonadRandom where
pure = return
(<*>) = ap
Run Code Online (Sandbox Code Playgroud)
但我得到错误:
The first argument of ‘Functor’ should have kind ‘* -> *’,
but ‘MonadRandom’ has kind ‘(* -> *) -> Constraint’
In the instance declaration for ‘Functor MonadRandom’
The first argument of ‘Applicative’ should have kind ‘* -> *’,
but ‘MonadRandom’ has kind ‘(* -> …
Run Code Online (Sandbox Code Playgroud) 我正在尝试在Rust中编写一些快速矩阵代码,并且需要确保循环展开.有没有办法创建一个编译时for循环?例如:我想要
unroll_loop!(f, a, 3);
Run Code Online (Sandbox Code Playgroud)
生成
f(a, 0);
f(a, 1);
f(a, 2);
Run Code Online (Sandbox Code Playgroud) 假设我将一个小函数传递f
给map
.可以哈斯克尔内嵌f
有map
产生一个小势在必行循环?如果是这样,Haskell如何跟踪f
真正的功能?使用Arrow组合器可以做同样的事情吗?
我想将这行代码转换map (^?! ix 0) [[0, 1], [4, 5], [9, 1]]
成完全使用镜头,所以像[[0, 1], [4, 5], [9, 1]] & each . ix 0
.但是,类型不匹配.这样做的正确方法是什么?
为什么存在WrappedMonad
和WrappedArrow
类型?是因为Monad
s不是Applicative
吗?鉴于WrappedArrow
存在,应该是实例
Arrow a => Applicative (Arrow a b)
Run Code Online (Sandbox Code Playgroud)
简单地构建到Haskell本身就像Applicative
现在的超类一样Monad
?
haskell ×7
rust ×3
applicative ×1
debugging ×1
fast-math ×1
lenses ×1
llvm ×1
llvm-codegen ×1
macros ×1
monads ×1
newtype ×1
optimization ×1
profiling ×1
state-monad ×1