我正在阅读Stroustrup的 C++之旅.在第9页,他说:
"数组的大小必须是一个常量表达式."
然后,在pg.16,他使用以下代码示例:
void vector vector_init(Vector& v, int s)
{
v.elem = new double[s]; // Allocate an array of s doubles
v.sz = s;
}
Run Code Online (Sandbox Code Playgroud)
这s不是一个常数表达式,那么如何初始化v.elem为new double[s]合法?
来自Haskell维基:
Monad可以被视为各种数据或控制结构的标准编程接口,由Monad类捕获.所有常见的monad都是它的成员:
Run Code Online (Sandbox Code Playgroud)class Monad m where (>>=) :: m a -> (a -> m b) -> m b (>>) :: m a -> m b -> m b return :: a -> m a fail :: String -> m a除了实现类函数之外,Monad的所有实例都应遵循以下等式或Monad Laws:
Run Code Online (Sandbox Code Playgroud)return a >>= k = k a m >>= return = m m >>= (\x -> k x >>= h) = (m >>= k) >>= h
问题:底层的三个monad法律是否实际上以语言强制执行?或者它们是否是你必须强制执行的额外公理,以便你的"Monad"语言结构与"Monad"的数学概念相匹配?
以下代码片段来自angular的文档.it()这里的功能是什么(我假设它具有一些传统意义,因为否则似乎没有给出其含义的上下文)?在棱角分明的网站上我没有看到它的任何引用.由于它的名字,它也很难谷歌.上下文是关于代码测试.
it('should say hello', function() {
var scopeMock = {};
var cntl = new MyController(scopeMock);
// Assert that username is pre-filled
expect(scopeMock.username).toEqual('World');
// Assert that we read new username and greet
scopeMock.username = 'angular';
scopeMock.sayHello();
expect(scopeMock.greeting).toEqual('Hello angular!');
});
Run Code Online (Sandbox Code Playgroud) 是否可以使用FFI或其他技巧从Haskell(在GHC上)调用Clojure函数?在这里,我有兴趣保持在GHC的范围内(即,不使用弗雷格).我也有兴趣将中心程序保存在Haskell中(意味着应该从Haskell调用Clojure函数,反之亦然).
这该怎么做?
我参与了一个涉及大量C位和FFI的Haskell项目.所以我发现自己经常运行并重新运行命令
$ stack build
$ stack build --force-dirty
$ stack clean
$ rm ./.stack-work
Run Code Online (Sandbox Code Playgroud)
反复进行,以便将C位正确链接到Haskell位.换句话说,有时事情在运行时才起作用stack build,有时它们不起作用(在这种情况下,我被迫一遍又一遍地循环上述命令,直到我的项目正确构建).
这意味着我没有正确理解在组装Haskell位之前stack(通过ghc)如何组装C位.所以这里有一个问题可以帮助我开始清理我的困惑:
运行stack clean和删除目录内容之间是否有任何值得注意的区别.stack-work?是否有.stack-work必要删除目录作为一个很好的预防措施,以确保您实际运行干净的构建?
问题:从Haskell类型转到外部类型并返回需要大量的样板代码.
例如,假设我们正在使用以下Haskell数据结构:
data HS_DataStructure = HS_DataStructure {
a1 :: String
, b1 :: String
, c1 :: Int
}
Run Code Online (Sandbox Code Playgroud)
为了使这个数据结构进入C的土地,我们需要考虑它的struct类比:
typedef struct {
char *a;
char *b;
int c;
} c_struct;
Run Code Online (Sandbox Code Playgroud)
但是为了将这样的结构从Haskell传递给C,我们必须转换HS_DataStructure为以下内容:
data HS_Struct = HS_Struct {
a :: CString
, b :: CString
, c :: CInt
} deriving Show
Run Code Online (Sandbox Code Playgroud)
然后我们必须做HS_Struct一个例子Storable:
instance Storable HS_Struct where
sizeOf _ = #{size c_struct}
alignment _ = alignment (undefined :: CString)
poke p c_struct …Run Code Online (Sandbox Code Playgroud) 我试图澄清我对JavaScript领域中"属性"与"密钥"与"值"这两个术语的理解.在阅读了几本关于语言的书籍甚至是谷歌搜索条款后,我仍然觉得我不清楚它们的确切含义.所以假设我们有以下内容:
var object = {"name" : 5};
Run Code Online (Sandbox Code Playgroud)
我对以下术语的理解是否正确:
属性是指"名称"
键是指"名字"
值是指5
我最关心的是"属性":它只引用标识符,还是整个名称/值对?
根据参数多态性的维基百科页面:
类型多态的一些实现在表面上类似于参数多态,同时还引入了特殊方面.一个例子是C++模板专业化.
问题:为什么C++只表示实现与paramaterized多态相似的表面形式?特别是,模板不是完全参数多态的一个例子吗?
考虑以下功能:
f :: a -> Int
f x = (1 :: Int)
Run Code Online (Sandbox Code Playgroud)
我们可能会说类型f是a -> Int,f因此属于"更高级"类型.
以下哪一项是最准确的思考方式f?
其实也有一个单一 f型的a -> Int.但是,可以使用,作为f :: Int -> Int作为f :: Double -> Int,等等.
从字面上讲,类型f不是a -> Int.实际上,这只是一种简短的说法,即有一类函数f的类型是具体的(即,有一个f :: Int -> Int,一个f :: Double -> Double等等;此外,这些函数中的每一个都是彼此不同的).
同样,我们可以考虑以下类型声明:
data Maybe a = Just a | Nothing
Run Code Online (Sandbox Code Playgroud)
并且问两种观点中的哪一种更正确:
没有 …
假设我们已经导入Data.Typeable了包含的内容cast :: (Typeable a, Typeable b) -> a -> Maybe b.
考虑一下
> cast 'n' :: Maybe Char
Just 'n'
Run Code Online (Sandbox Code Playgroud)
然而
> cast 7 :: Maybe Char
Nothing
Run Code Online (Sandbox Code Playgroud)
我理解上面的内容,但它似乎是一个微不足道的例子.它没有揭示为什么有人需要使用cast运算符(据我所见).
问题:是否有一个使用的cast例子真正"改变"一种类型的值到另一种类型?我能想到的(不实际工作GHCI)最近的例子是改变的类型7从Integer到Double:
> cast 7 :: Maybe Double
Just '7' -- this doesn't work, as 7 is typed as a Integer above; instead GHCi returns Nothing
Run Code Online (Sandbox Code Playgroud)