在我目前的项目中,我正在处理多维数据结构.基础文件是顺序存储的(即一个巨大的数组,没有矢量矢量).使用这些数据结构的算法需要知道各个维度的大小.
我想知道一个多维迭代器类是否已经以通用的方式在某个地方进行了定义,并且是否有任何标准或首选方法来解决这个问题.
目前我只是使用线性迭代器和一些额外的方法来返回每个维度的大小以及第一部分中有多少维度.我不喜欢它的原因是因为我不能以合理的方式使用std :: distance(即只返回整个结构的距离,而不是分别为每个维度).
在大多数情况下,我将以线性方式访问数据结构(第一维开始到结束 - >下一维+ ......等等),但知道一个维度"结束"的时候会很好.在这种方法中,我不知道如何使用运算符*(),运算符+()和运算符==()来执行此操作.
向量方法的向量是不受欢迎的,因为我不想拆分文件.此外,算法必须在具有不同维度的结构上运行,因此难以概括(或者可能有一种方法?).
Boost multi_array具有相同的问题(迭代器的多个"级别").
我希望这不是太模糊或抽象.任何暗示正确的方向将不胜感激.
我自己一直在寻找解决方案并重新访问boost :: multi_array.事实证明,可以使用它们生成关于数据的子视图,但同时也在顶层采用直接迭代器并且隐含地"平坦化"数据结构.然而,multi_array的实现版本不适合我的需要,因此我可能会自己实现一个(在后台处理文件的缓存),这与其他multi_arrays兼容.
实施完成后,我会再次更新它.
给出以下代码:
case class Person(name :String)
case class Group(group :List[Person])
val personLens = GenLens[Person]
val groupLens = GenLens[Group]
Run Code Online (Sandbox Code Playgroud)
我如何从选择中"过滤掉"某些人,不是通过索引而是通过特定属性Person,例如:
val trav :Traversal[Group, Person] = (groupLens(_.group) composeTraversal filterWith((x :Person) => /*expression of type Boolean here */))
Run Code Online (Sandbox Code Playgroud)
我只找到了这个filterIndex函数,它只包含基于索引的列表中的元素,但这不是我想要的.
filterIndex 采用类型的函数: (Int => Boolean)
而且我要:
filterWith(由名称构成),取a (x => Boolean),其中x具有lists元素的类型,即Person在这个简短的例子中.
这似乎是如此实际和普遍,以至于我认为有人已经考虑过这一点而且我(我必须承认对这个问题的理解有限)不明白为什么不能这样做.
我是否遗漏了这个功能,它是否尚未实现,或者由于某种原因显然是不可能的(如果你有时间,请解释).
谢谢.
为什么协程(现在在C++ 1z的最新草案中)被实现为核心语言功能(花哨的关键字和所有)而不是库扩展?
已经存在一些针对它们的实现(Boost.Coroutine等),其中一些可以与我所阅读的平台无关.为什么委员会决定将其融入核心语言本身?
我不是说他们不应该,但是Bjarne Stroustrup自己在一些谈话中提到过(不知道哪一个),应该尽可能在图书馆中实现新功能,而不是触及核心语言.
那么有充分的理由吗?有什么好处?
我正在尝试在Rust中实现类型级乘法.
添加已经有效,但我遇到了"临时"类型变量的问题.
代码:
use std::marker::PhantomData;
//Trait for the type level naturals
trait Nat {}
impl Nat for Zero {}
impl<T: Nat> Nat for Succ<T> {}
//Zero and successor types
struct Zero;
struct Succ<T: Nat>(PhantomData<T>);
//Type level addition
trait Add<B,C>
where Self: Nat,
B: Nat,
C: Nat
{}
impl<B: Nat> Add<B,B> for Zero {}
impl<A: Nat,B: Nat,C: Nat> Add<B,C> for Succ<A>
where A: Add<Succ<B>,C>
{}
fn add<A: Nat, B: Nat, C: Nat>(
a: PhantomData<A>,
b: PhantomData<B>)
-> PhantomData<C>
where A: Add<B,C> …Run Code Online (Sandbox Code Playgroud) 为了更好地理解Rusts恐慌/异常机制,我编写了以下代码:
#![feature(libc)]
extern crate libc;
fn main() {
let mut x: i32;
unsafe {
x = libc::getchar();
}
let y = x - 65;
println!("{}", x);
let z = 1 / y;
println!("{}", z);
}
Run Code Online (Sandbox Code Playgroud)
我想检查Rust如何处理除零案例.最初我假设它要么面对未处理的SIGFPE并且正在死亡,要么实施了一个处理程序并将其重新路由到恐慌(现在可以处理?).
代码是冗长的,因为我想确保Rust在编译时知道某些东西是零,因此用户输入时不会做任何"智能".只要给它一个'A'就可以了.
我发现Rust实际上产生的代码每次在除法发生之前检查零除法.我甚至看了一次装配.:-)
长话短说:我可以禁用此行为吗?我想对于较大的数据集,这可能会产生很大的性能影响.为什么不使用我们的CPU能力为我们检测这些东西?我可以设置自己的信号处理程序并处理SIGFPE吗?
根据Github上的一个问题,前一段时间的情况肯定是不同的.
我认为事先检查每个部门远离"零成本".你怎么看?我错过了一些明显的东西吗
我最近一直在玩LiquidHaskell和Idris,我得到了一个非常具体的问题,我无法在任何地方找到明确的答案.
伊德里斯是一种依赖类型的语言,在很大程度上是很好的.但是我读到类型检查期间的某些类型术语可以从编译时"泄漏"到运行时,即使是强硬的Idris也会尽力消除这些术语(这甚至是一个特殊功能......).然而,这种消除并不完美,有时确实会发生.如果,为什么以及何时发生这种情况并未立即从代码中清除,有时会对运行时性能产生影响.
我见过人们更喜欢Haskells的类型系统,因为它不会发生在那里.完成类型检查后,即可完成.类型被"丢弃"并且在运行时不使用.
LiquidHaskell的故事是什么?与传统的Haskell相比,它增强了类型系统的功能.LiquidHaskell是否也为某些类型的"星座"注入运行时位,或者(我怀疑)只是在Haskell上添加了另一层"更好"的类型,它们不会影响任何形状或形式的运行时.
意思是,如果删除特殊的LiquidHaskell类型注释并使用标准GHC编译它,生成的代码是否始终相同?换句话说:LiquidHaskell扩展只是编译时间吗?
如果是的话,这似乎是两个世界中最好的,或者LiquidHaskell在类型系统中不像Idris那样具有表现力,因此没有运行时条款管理?
我正在经历"真实的世界Haskell",我正在做它随之而来的练习.
我注意到一些我觉得很奇怪的东西.
以此功能为例:
myAverage :: (Fractional a) => [a] -> Maybe a
myAverage [] = Nothing
myAverage xs = Just $ (mySum xs) / (fromIntegral $ myLength xs)
该(/)函数需要两个作为实例的参数Fractional.
myLength返回一个Int所以我使用the fromIntegral函数,因为我被告知.
但fromIntegral只保证返回的值将是一个实例Num.
为什么在这种情况下Num也"包含"一个实例Fractional.不是Fractional更具体吗?
为什么编译器不抱怨我只有一个Num来自返回类型而不是"正确" Fractional.
为什么我不能Int直接使用它,它也是一个实例Num,不是吗?
在打电话的情况下,mySum我得到它.它需要一个Nums 的列表,但我用Fractionals 列表(它们也是Nums,因为它们是从它派生的)提供它.返回类型具有相同的类型,从类型注释(见下文)可以看出:单个元素Fractional
但是如果fromIntegral我无法推断自己(编译器显然可以:-))返回的值也是一个实例Fractional.为什么?它所采用的类型显然不是Fractional …
我发现很多"特殊形式"只是在背景中使用星号版本的宏(fn*,let*和所有其他版本).
例如,在fn的情况下,它将解构能力添加到fn*单独不提供的混合中.我试图找到一些关于fn*可以和不能自己做什么的详细文档,但我没那么幸运.
它肯定支持:
&/ catchall指标
(fn* [x & rest] (do-smth-here...))
Run Code Online (Sandbox Code Playgroud)并且好奇地还有arity的超载,如:
(fn* ([x] (smth-with-one-arg ...)
([x y] (smth-with-two-args ...))
Run Code Online (Sandbox Code Playgroud)所以我的问题最终是,为什么不定义:
(fn& [& all-args] ...)
Run Code Online (Sandbox Code Playgroud)
这将是绝对最小的,可以通过宏提供所有arity选择(检查参数列表的大小,if/case语句直接代码路径,将前几个参数绑定到所需的符号等).
这是出于性能原因吗?也许有人甚至有一个链接到星号特殊形式的实际标准定义方便.
首先:我已经阅读了关于SO的类似问题的答案,但没有一个有效.
情况:
什么有效:
.Xauthority文件复制到其他用户,X11转发也可以.一些设置信息:
DISPLAY 变量在容器中设置(到host-ip-addr:10.0,因为sshd正在侦听的TCP端口6010).tcpdump选中).什么行不通:
X11 connection rejected because of wrong authentication.
xterm: Xt error: Can't open display: host-ip-addr:10.0
我试过的事情:
ssh -Y在机器B上使用选项启动客户端ssh"X11ForwardTrusted yes"在机器B上放入ssh_configxhost + (因此允许任何客户端连接)在机器B上Host *在机器B上放入ssh_configX11UseLocalhost no在机器A上放入sshd_config(允许非localhost客户端)xauth add使用计算机A上的登录用户在容器中添加X身份验证令牌.Xauthority文件从工作用户复制到容器中即可.Xauthority文件具有正确的权限和所有者我怎样才能禁用所有X安全性的东西并让它工作?
甚至更好:我怎样才能让它与安全性一起工作?
是否至少有一种方法可以进行大量调试,以确定问题的确切位置?