我在理解Haskell中IORef类型和MVar类型之间的基本区别时遇到了一些麻烦.有人可以帮我解决这个问题吗?他们似乎解决了同样的问题.MVar似乎是针对多线程的,但IORef有atomicModifyIORef函数.
谢谢!
我有一个小的Haskell程序,很好奇为什么在运行它时会抛出除零异常(GHC 7.0.3)
import qualified Data.ByteString.Lazy as B
import Codec.Utils
convert :: B.ByteString -> [Octet]
convert bs = map (head . toTwosComp) $ B.unpack bs
main = putStrLn $ show $ convert $ B.pack [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
谁能帮我理解这里发生了什么?
关于Haskell的类型系统,我有一个相当普遍的问题.我正在努力熟悉它,我有以下功能:
getN :: Num a => a
getN = 5.0 :: Double
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,我收到以下错误:
Couldn't match expected type `a' against inferred type `Double'
`a' is a rigid type variable bound by
the type signature for `getN' at Perlin.hs:15:12
In the expression: 5.0 :: Double
In the definition of `getN': getN = 5.0 :: Double
Run Code Online (Sandbox Code Playgroud)
据我了解,该函数设置为"返回"类Num中的类型.Double是在这个类中(http://www.zvon.org/other/haskell/Outputprelude/Num_c.html),所以我原本预计在这种情况下"返回"Double是可以的.
有人可以解释一下吗?
我想知道是否可以使用Swift中定义的SIMD类型<simd/simd.h>(例如vector_float3).我似乎无法找到一种方法来做到这一点.
谢谢!
我正在使用一个原生C++应用程序,它有一个插件系统,它将在LoadLibrary()/ GetProcAddress().dll上调用函数.我想实现其中一个插件,在插件中我想使用持久性框架来保存/加载一个复杂的对象图到磁盘.
看起来Windows上支持最多的ORM是实体框架,这个页面说实体框架核心是最现代的风格.这个页面好像说,为了使用Entity Framework Core,你的数据模型必须用C#编写.
所以,听起来我必须从C++调用C#.幸运的是,似乎Entity Framework Core 支持通用Windows运行时,它应该使语言之间的调用变得容易.
此演示文稿似乎表示从C++与Universal Windows Runtime交互涉及创建Windows运行时组件,编译步骤可以从Windows运行时组件的.winmd文件生成粘合代码.
因此,我可以制作一个包含两个项目的Visual Studio解决方案:外部"C++ Windows桌面动态链接库"项目和内部"C#通用Windows运行时组件".
然后,文档说"引用Windows运行时组件的Windows运行时元数据(.winmd)文件,然后构建." 但是,当我在外部项目中添加引用时,当我尝试选择内部项目时出现错误,并且没有选项可以浏览以选择任意项.winmd.
即使我进入解决方案管理器并删除除x86两个项目之外的所有平台,也会发生此错误.
这是令人惊讶的,因为这篇Windows博客帖子明确表示本机代码应该能够通过添加对该引用的引用来调用UWP代码.winmd(尽管帖子使用较旧的C++/CX语法).
如果我重新开始并使用"C++/WinRT Windows运行时组件"而不是"C++ Windows桌面动态链接库"项目,我仍然有问题.
如果我这样做,我可以添加参考就好了.
但是,当我尝试构建时,我遇到了构建失败.
1>------ Build started: Project: InnerCSharp, Configuration: Debug x86 ------
1> InnerCSharp -> C:\Users\lithe\source\repos\EntityFrameworkInsideC++\InnerCSharp\bin\x86\Debug\InnerCSharp.winmd
2>------ Build started: Project: OuterC++WinRT, Configuration: Debug Win32 ------
2>MIDLRT Processing C:\Users\lithe\source\repos\EntityFrameworkInsideC++\OuterC++WinRT\Class.idl
2>Class.idl
2>MIDLRT Processing C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\winrt\winrtbase.idl
2>winrtbase.idl
2>MIDLRT Processing …Run Code Online (Sandbox Code Playgroud) 我写了这个非常简单的C++程序,我想知道为什么编译器会在两个指针引用之间列出vtable.这是C++程序:
class Foo {
public:
virtual void bar() {
}
};
int main(int argc, char *arv[]) {
Foo foo;
Foo *foo_p(&foo);
foo_p->bar();
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以看一下编译器生成的程序集:
$ g++ -ggdb -Wall -O0 -S test.cpp
Run Code Online (Sandbox Code Playgroud)
以下是相关部分:
.loc 1 9 0
leaq -16(%rbp), %rax # put the address of 'foo' in %rax
movq %rax, %rdi # use it as the first argument of the following function
call _ZN3FooC1Ev # call the Foo constructor
.loc 1 10 0
leaq -16(%rbp), %rax # put the address of …Run Code Online (Sandbox Code Playgroud) 我正在用C++编写一个使用CLAPACK ATLAS库的程序.但是,我无法让程序成功链接到库.我写了一个小C程序来更好地演示这个问题.有趣的是,如果我用GCC编译它,这个小的演示程序链接就好了,但是当我尝试用G ++编译时,我得到了相同的链接器错误.我希望有人可以帮我弄清楚G ++和GCC究竟在做什么,以便将原始程序链接起来(原始程序是一个C++程序,我不能只是"使用GCC")
这是一个小型演示程序:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <cblas.h>
#include <clapack.h>
// a is a column-major array of all the values in the matrix to invert
// The matrix's height and width are the same because it is a square matrix.
void invertMatrix(float *a, unsigned int height)
{
int info, ipiv[height];
info = clapack_sgetrf(CblasColMajor, height, height, a, height, ipiv);
info = clapack_sgetri(CblasColMajor, height, a, height, ipiv);
}
void displayMatrix(float *a, unsigned int height, unsigned int width) …Run Code Online (Sandbox Code Playgroud) 我试图了解可可绑定的方向性。特别是,我已经编写了这个小程序来演示绑定,但是我不确定为什么会输出它的作用。这是程序:
@interface SimpleClass : NSObject
@property (retain) NSString *s;
@end
@implementation SimpleClass
@end
int main(int argc, char *argv[]) {
SimpleClass *simpleClass1 = [[SimpleClass alloc] init];
SimpleClass *simpleClass2 = [[SimpleClass alloc] init];
[simpleClass1 bind:@"s" toObject:simpleClass2 withKeyPath:@"s" options:nil];
//[simpleClass1 willChangeValueForKey:@"s"];
simpleClass1.s = @"Hello, World!";
//[simpleClass1 didChangeValueForKey:@"s"];
NSLog(@"%@", simpleClass1.s);
NSLog(@"%@", simpleClass2.s);
simpleClass2.s = @"Something else!";
NSLog(@"%@", simpleClass1.s);
NSLog(@"%@", simpleClass2.s);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行该程序时,输出为:
Hello, World!
(null)
Something else!
Something else!
Run Code Online (Sandbox Code Playgroud)
这使我相信绑定是单向的。不过,我已经遇到这个和这个,这两个似乎是说,绑定应该是双向的(虽然也不是很清楚)。取消注释willChangeValueForKey和didChangeValueForKey行不会影响输出。
我的结论是正确的,绑定是单向的吗?还是有一些方法可以在绑定创建时指定它是双向的?
crypto-api包中有一个Crypto.Random API,用于指定"伪随机数生成器"的含义.
我使用System.Random的RandomGen类的实例,即StdGen实现了这个API:
instance CryptoRandomGen StdGen where
newGen bs = Right $ mkStdGen $ shift e1 24 + shift e2 16 + shift e3 8 + e4
where (e1 : e2 : e3 : e4 : _) = Prelude.map fromIntegral $ unpack bs
genSeedLength = Tagged 4
genBytes n g = Right $ genBytesHelper n empty g
where genBytesHelper 0 partial gen = (partial, gen)
genBytesHelper n partial gen = genBytesHelper (n-1) (partial `snoc` nextitem) newgen
where (nextitem, newgen) = …Run Code Online (Sandbox Code Playgroud) haskell ×4
c++ ×2
typeclass ×2
types ×2
assembly ×1
atlas ×1
c ×1
c# ×1
c++-winrt ×1
cocoa ×1
extern-c ×1
g++ ×1
gcc ×1
instance ×1
ioref ×1
lapack ×1
linkage ×1
macos ×1
objective-c ×1
opengl ×1
opengl-3 ×1
opengl-4 ×1
opengl-es ×1
pointers ×1
simd ×1
subclass ×1
swift ×1
type-systems ×1
uwp ×1
vector ×1
vtable ×1