使用以下代码时,不显示"hello2",因为在第3行上创建的临时字符串在执行第4行之前死亡.在第1行使用#define避免了这个问题,但有没有办法在不使用#define的情况下避免这个问题?(C++ 11代码没问题)
#include <iostream>
#include <string>
class C
{
public:
C(const std::string& p_s) : s(p_s) {}
const std::string& s;
};
int main()
{
#define x1 C(std::string("hello1")) // Line 1
std::cout << x1.s << std::endl; // Line 2
const C& x2 = C(std::string("hello2")); // Line 3
std::cout << x2.s << std::endl; // Line 4
}
Run Code Online (Sandbox Code Playgroud)
澄清:
请注意,我相信Boost uBLAS存储引用,这就是为什么我不想存储副本.如果您建议我按值存储,请解释为什么Boost uBLAS出错并且按值存储不会影响性能.
假设我有一个类C,以及一个make_c(x)创建C实例的函数.
C商店x参考.
make_c(x)当x一个未命名的临时(当然会在行尾破坏,留下悬空引用)但是接受命名的临时值和其他值时,我如何编写以编译错误?
我一直在问Haskell中关于并发性的几个问题,特别是TVar我对Livelock的问题有所顾虑TVar.
相反,我提出了这个解决方案.
(1)将程序中的所有共享数据包装在一个数据结构中,并将其包装在一个数据结构中IORef.(2)只需使用即可进行任何更改atomicModifyIORef.
我相信这可以防止死锁和活锁(而TVar只会阻止前者).此外,因为atomicModifyIORef简单地将另一个thunk链接到一个链(这是一对指针操作),这不是一个瓶颈.对数据的所有实际操作可以并行完成,只要它们不相互依赖.Haskell运行时系统将解决这个问题.
但是我觉得这太简单了.我错过了什么"陷阱"吗?
这是从这个问题开始的.
为什么是:
... = ... x :: a ...
Run Code Online (Sandbox Code Playgroud)
未定义为
... = ... x `asTypeOf` (undefined :: a) ...
Run Code Online (Sandbox Code Playgroud)
即在赋值语句中,不是类型声明?
(注:a可以是任何东西,即Int,a或Maybe a)
作为一个额外的问题,什么代码会破坏定义x :: a为x `asTypeOf` (undefined :: a)?如何,它会使任何有效的代码无效或行为不同吗?
我想在编译时创建一个映射,将编译时键映射到运行时值.如果不存在所有必需的键,函数应该能够检查这些键并抛出编译器错误.
这大致是我想要实现的目标:
class HasFirst a
first :: String
class HasMiddle a
middle :: String
class HasLast a
last :: String
print_full_name :: (HasFirst a, HasLast a) => a -> String
addFirst :: String -> a -> b
addFirst s x = -- ( Add a first name to x )
emptyName :: -- some empty name
x1 = addFirst "John" $ addLast "Smith" $ emptyName
x2 = addMiddle "Bob" $ addLast "Smith" $ emptyName
main = putStr $ print_full_name x1 …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个Func表示函数的类,然后创建一个Dot组成函数的数据类型.下面是我的尝试,但我收到编译错误:
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE GADTs #-}
module Func where
class Func f a b | f -> a, f -> b where
apply :: f -> a -> b
data Dot f1 f2 where
Dot :: (Func f1 a b, Func f2 b c) => f1 -> f2 -> Dot f1 f2
instance Func (Dot f1 f2) a c where
apply …Run Code Online (Sandbox Code Playgroud) 我正在尝试在Solaris上编译最新版本的GHC(例如,7.4或7.6),使用6.12.1二进制文件进行编译.但是,我注意到GHC需要精确的GCC版本4.1.2来编译自己,以及许多其他要求.
为什么建立GHC的先决条件如此严格?Haskell是如此强大,我无法想象很多不能用纯Haskell编写的,那么为什么GHC需要一个C编译器来编译自己呢?有没有我只能用Haskell编译器编译的GHC版本?请注意,我不需要它来生成高度优化的代码,即使只是让GHCi工作也没问题.
我已经发现自己当你想要将一个列表汇总到一个结果(即)时,foldl(或foldl')是最好的方法sum,并且foldr当你想要产生另一个(甚至是无限的)列表(即filter)时,这是最好的方法.
所以我正在考虑将这两者结合起来的处理.所以我做了这个功能sum_f.sum_f它是相当简单的,它只是添加列表的元素,但如果它找到一个如此f x为真的元素,它将当前结果作为输出作为列表的元素,并从该点开始全部求和.
代码在这里:
sum_f :: (Num a) => (a -> Bool) -> [a] -> [a]
sum_f f =
let
sum_f_worker s (x:xs) =
let
rec_call z = sum_f_worker z xs
next_sum = s + x
in
next_sum `seq` if (f x) then next_sum : (rec_call 0) else rec_call next_sum
sum_f_worker _ [] = []
in
sum_f_worker 0
Run Code Online (Sandbox Code Playgroud)
现在举例来说,让所有正整数除以任何2的幂.这应输出以下内容:
[1, 2, 3+4, 5+6+7+8, 9+10+11+12+13+14+15+16, …Run Code Online (Sandbox Code Playgroud) 以下代码:
def a = [4,10,6].iterator().sort();
println a[1];
println a[1];
Run Code Online (Sandbox Code Playgroud)
产生以下输出:
6
null
Run Code Online (Sandbox Code Playgroud)
奇怪的是它似乎a[1]正在改变名单.这记录在哪里?
ByteString的文档提供了以下代码示例:
breakByte :: Word8 -> ByteString -> (ByteString, ByteString)
breakByte 'c' "abcd"
Run Code Online (Sandbox Code Playgroud)
但是,当我写相同时,我得到以下错误(ideone):
Couldn't match expected type `GHC.Word.Word8'
with actual type `Char'
Run Code Online (Sandbox Code Playgroud)
当然'c'是Char,不是Word8.据推测,他们正在使用一些扩展,它允许fromInteger样式函数自动在Char文字上工作,但我不确定是什么.{-# LANGUAGE OverloadedStrings #-}似乎没有任何区别.
haskell ×7
c++ ×2
c++11 ×2
ghc ×2
bytestring ×1
concurrency ×1
fold ×1
groovy ×1
ioref ×1
shared-state ×1