小编Dmi*_*kin的帖子

是否可以在Haskell中使用可调用对象定义类型?

我对haskell很新,对它的类型系统还不太满意.我想知道,如果有能力定义类型(数据类型?),哪些实例可以作为函数调用?

类似物是

__call__ 
Run Code Online (Sandbox Code Playgroud)

Python中的方法或类方法

operator() 
Run Code Online (Sandbox Code Playgroud)

在c ++中.(更多示例在维基百科中给出"功能对象"一词).

应用这种结构的例子是Polynom.该对象由其系数列表定义,即我希望有这样的类型:

data Num a => Polynom a = Polynom [a]
                          deriving (...)
Run Code Online (Sandbox Code Playgroud)

现在我当然可以定义功能

callPoly :: Num a => (Polynom a) -> a -> a
callPoly p x = ... -- implementation: extract coefficients of p,
                   -- construct polynomial and call it on x
Run Code Online (Sandbox Code Playgroud)

(这里我不打扰,能够在Floats上用Int系数调用多项式......这只是技术细节)

现在我可以在我的polinomial上调用它(在交互式提示符中):

let myPoly = Polynomial [1 2 3]
let applicationResult = callPoly myPoly 3
Run Code Online (Sandbox Code Playgroud)

但这种方式并不太花哨.希望能够直接调用多项式作为

let applicationResult = myPoly 3
Run Code Online (Sandbox Code Playgroud)

所以问题是:可以定义这样的多项式类型,可以调用哪些对象(实例)(用作函数)?可能是这种模式可能以其他方式实现,不涉及"数据"?可能是一些玩功能类型或smth.其他?

当然,这个想法不仅可以应用于多项式.实际上,对于任何必须"具有类型"并具有"一些附加数据"的函数(在多项式的情况下 - 它是系数).

或者,如果这是不可能的,那么是否有一些特定的原因或者它不被支持?

PS:在我看来,直接方法(如上所述)是不可能的,因为要可调用myPoly必须是类型(Int - > Int).但是类型(Int …

haskell

10
推荐指数
2
解决办法
618
查看次数

docker容器不需要操作系统,但是每个容器都有一个。为什么?

如今,“ docker”是一个时髦的词,我试图弄清楚它是什么以及它如何工作。更具体地说,它与普通VM(例如VirtualBox,HyperV或WMWare解决方案)有何不同。

该文档的简介部分(https://docs.docker.com/get-started/#a-brief-explanation-of-containers)内容如下:

容器在主机的内核上本地运行应用程序。与仅通过管理程序虚拟访问主机资源的虚拟机相比,它们具有更好的性能特征。容器可以获得本机访问,每个容器都在一个离散的进程中运行,占用的内存不会超过任何其他可执行文件。

答对了!这是区别。容器直接在托管OS的内核上运行,这就是为什么它们如此轻巧和快速(此外,它们以docker hub的形式提供了进程的隔离和良好的分发机制,在容器之间相互连接的能力方面发挥了很好的作用) 。

但是请稍等。我可以使用docker在Windows上运行Linux应用程序-怎么可能?当然,有一些虚拟机。否则我们将无法完成工作...

好的,但是当我们在Linux主机上工作时,它看起来如何?这确实引起了混乱……仍然有人将OS定义为我们要创建的每个映像的基础映像。即使我们说“ FROM暂存器”-暂存器仍然是一些简约的内核...

问题1:如果我运行例如CentOS主机,是否可以创建将直接使用此主机操作系统内核(而不是使用包含其自身操作系统的VM)的容器?如果是,我该怎么办?如果不是,为什么docker的文档对我们说谎(因为docker映像始终在某些VM内运行,而与其他VM并没有太大不同,或者呢?)?

经过一番思考并环顾四周,我想知道是否对运行图像进行了一些优化。来了

问题2:如果我运行两个容器,这两个容器的映像都基于同一父映像,那么此父映像仅会被加载到内存一次吗?每个容器将有一个虚拟机,还是只有一个同时运行两个容器的虚拟机?如果我们使用不同的操作系统呢?

第三个问题颇为棘手:

问题3:在某处有一些资源描述了这种事情……因为讨论Docker的大多数文章都说“太酷了,您一定要使用ut。只需运行一个命令就可以开心”。 ..不会解释太多。

谢谢。

docker

9
推荐指数
3
解决办法
3032
查看次数

在C++中:const引用是指"只读视图"还是需要引用对象的不变性?

这个问题可以通过例子表示如下:这段代码是否有效?

int a = 1;
const int& ca = a;
++a; //< Q: Is this valid?
cout << "a: " << a << endl;
cout << "ca: " << ca << endl; // Q: Is it guaranteed to output "2"? Is it valid at all?
Run Code Online (Sandbox Code Playgroud)

使用MSVC和MinGW,上面的代码段按预期工作:如果我查询ca后缀,它返回2(即它被非const引用更改).但问题是:从标准的角度考虑这种情况如何?是否可以,我们改变对象,我们有const引用(或者我们必须定义ca为const的易失性参考,以使代码片段正确)?

因此,如果上面的代码片段是正确的,那么这意味着,const引用不保证,引用的对象是常量.它只禁止我们通过给定的引用来改变它,即建立引用对象的"只读"视图.它是否正确?

编辑:
感谢所有回答我问题的人.答案陈述了这件事,这对我来说似乎很自然.但是我真的很感激有人提到c ++标准中的特定条款.

Edit2:
扩展了原始示例,使问题的概念更加清晰.

Edit3
另一个例子,最初出现在我对Mats Peterson答案的评论中.

class MyClass {
public:
    // ...
    const X& getX() const;
    void modifyX();
private:
    X m_x;
};

void someFun() { …
Run Code Online (Sandbox Code Playgroud)

c++

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

标签 统计

c++ ×1

docker ×1

haskell ×1