小编chs*_*chs的帖子

GHC的非懒惰分支

我听说有一个GHC的分支默认编译为严格的代码,而懒惰可以通过注释启用.(IIRC,他说一家金融公司开发分支并将其用于生产代码.)这是真的吗?我找不到它.

该人士还认为,严格评估比懒惰评估(默认情况下)更实用的观点越来越受到人们的认可.我没有在Haskell邮件列表中找到这个确认,但也许这是因为那里的人不是那种以实践为导向的?

所有我觉得严格的Haskell就像明确的东西$!rnf.虽然我发现惰性评估非常优雅,但我想在Haskell中开发一个程序,我希望避免空间泄漏,并希望获得可预测的性能.

免责声明:我不是要严格要求,我只想看看严格的Haskell或类似的东西.

haskell ghc

11
推荐指数
2
解决办法
1515
查看次数

高阶函数中的存在类型

我有一个函数,它的工作是计算类型的a某些值函数的类型的最佳值a -> v

type OptiF a v = (a -> v) -> a
Run Code Online (Sandbox Code Playgroud)

然后我有一个容器想要将这样的函数与另一个使用值值的函数一起存储:

data Container a = forall v. (Ord v) => Cons (OptiF a v) (a -> Int)
Run Code Online (Sandbox Code Playgroud)

这个想法是,任何实现类型函数的人OptiF a v都不应该被细节所困扰,v除非它是一个实例Ord.

所以我写了一个函数,它接受了这样一个值函数和一个容器.使用OptiF a v它应该计算最佳值wrt val并将其插入容器的result函数中:

optimize :: (forall v. (Ord v) => a -> v) -> Container a -> Int
optimize val (Cons opti result) = result (opti val)
Run Code Online (Sandbox Code Playgroud)

到目前为止这么好,但我不能打电话optimize,因为

callOptimize :: …
Run Code Online (Sandbox Code Playgroud)

haskell existential-type

10
推荐指数
1
解决办法
432
查看次数

谓词缓存

是否有Prolog实现或库来缓存谓词?

或者你会使用assertz/1和retract/1实现一个FIFO缓存,如下所示:

:- dynamic cache/1.
ccall(G) :- cache(G).
ccall(G) :-
    \+ cache(G),
    call(G),
    ( findall(G0,cache(G0),Gs), length(Gs,N), N =:= 100 -> once retract(cache(_)) ; true ),
    assertz(cache(G)).
Run Code Online (Sandbox Code Playgroud)

在ECLiPSe-CLP中,可以使用额外逻辑变量至少替换findall/3行:

...
( getval(cache_size) =:= 100 -> once retract(cache(_)) ; incval(cache_size) ),
...
Run Code Online (Sandbox Code Playgroud)

在我的盒子上,1000次调用此ccall/1需要> 4.00 cpu sec,而实际目标cpu时间可忽略不计(0.04 cpu sec).所以我想在解释器中实现的缓存(特别是LRU缓存等)仍然优于assertz/1和retract/1.

我不想为每个谓词都进行缓存,当然,只有很少的谓词.一个场景可能是这样的:p([H|T], E) :- q(H,E) ; p(T,E)q/2没有副作用.p/2被称为一个稳定增长的名单,但总是/经常是相同的E.

prolog

6
推荐指数
1
解决办法
847
查看次数

是否有一种惯用的方法来保持对不断增长的容器元素的引用?

我正在尝试为类型的对象编写容器,该容器T提供&T对存储对象的引用的访问(我想避免复制).由于容器只在其生命周期内增长,因此返回引用的生命周期&T应与容器的生命周期相同.

到目前为止,我最接近的是Box<T>在容器内部使用对象并用于Box<T>.as_ref()返回对这些对象的引用.然而,然而,我遇到了与此最小示例中相同的问题:

fn main() {
    let mut v = vec![Box::new(1)]; // line 1
    let x = v[0].as_ref();         // line 2: immutable borrow occurs here
    println!("x = {:?}", x);       // line 3
    v.push(Box::new(2));           // line 4: mutable borrow occurs here -> error
    println!("x = {:?}", x);       // line 5
}
Run Code Online (Sandbox Code Playgroud)

据我所知,x如果v在可变借款期间删除了它,那么在第5行使用是不合理的.但这不是这里的情况,它永远不会是我的容器.如果没有安全的方法在Rust中表达这一点,我怎么能"修复"这个例子(没有复制x)?

lifetime rust borrow-checker

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