鉴于以下 Rust 程序:
struct Value<'v>(&'v ());
struct Container {}
impl Container {
fn get<'v>(&'v self) -> Value<'v> {
todo!()
}
fn set<'v>(&'v self, x: Value<'v>) {
todo!()
}
}
fn convert<'v1, 'v2>(x: &'v1 Container, env: &'v2 Container) {
let root: Value<'v2> = env.get();
x.set(root);
}
Run Code Online (Sandbox Code Playgroud)
我希望convert是一个编译时错误,Value<'v2>因为传递给x.set()它需要一个类型的值Value<'v1>- 但它成功编译。'v1和之间没有子类型关系'v2。Rust 如何推断令人满意的生命周期?
我正在编写Visual Studio 2008扩展.我希望每次DTE.ActiveDocument更改时都会收到通知,因此我可以在自定义面板中更新某些内容,该面板执行与解决方案资源管理器类似的功能.我还没有找到发生这种情况时发生的任何事件.有这样的事件吗?
具体来说,我正在寻找类似的东西:
var dte = GetService(typeof(EnvDTE._DTE)) as EnvDTE.DTE;
dte.Events.DTEEvents.ActiveDocumentChanged += s => {
// implies dte.ActiveDocument has changed value
}
Run Code Online (Sandbox Code Playgroud) 鉴于支持代码:
{-# LANGUAGE ExtendedDefaultRules, DeriveDataTypeable #-}
{-# LANGUAGE FlexibleInstances, UndecidableInstances, OverlappingInstances #-}
import Data.Typeable
default(A)
data A = A deriving (Eq,Show,Typeable)
class Show a => Testable2 a where
instance (Show a, Eq a) => Testable2 a where
instance (Show a, Testable2 b) => Testable2 (a -> b) where
instance (Show a, Show b) => Show (a -> b) where show _ = "<func>"
test :: (Show p, Typeable p, Testable2 p) => p -> IO ()
test = print . …Run Code Online (Sandbox Code Playgroud) 我想定义我自己的版本fib来玩,但是fib由...导出Prelude.如何隐藏导入Prelude?在Haskell中我会写import Prelude hiding (fib),但这在Idris中不起作用.
我有一个Criterion基准测试,每个bgroup测试对应一个测试,并且每个测试中bgroup有两个bench不同选项的测试值.例如:
main = defaultMain
[bgroup "test1" [bench "v1" test1_1, bench "v2" test1_2]
,bgroup "test2" [bench "v1" test2_1, bench "v2" test2_2
-- lots more tests
]
Run Code Online (Sandbox Code Playgroud)
在每个测试中bgroup,两个bench测试是可比的.但是,test1需要2000微秒,而test2需要45微秒.概览图(对我想要做的最有用)在同一轴上显示不同的测试,因此我可以清楚地看到差异test1,但test2很难看到.
是否可以将每个标准化bgroup用于绘图?或者在不同的轴上显示它们?或者我应该转储CSV数据并绘制我想要的内容吗?
当使用带有ASIO模式的Websocket ++时,我开始连接:
boost::shared_ptr<client> x(new client());
x->init_asio();
websocketpp::lib::error_code ec;
client::connection_pt con = x->get_connection(url, ec);
x->connect(con);
new thread(boost::bind(&LocalCallbacks::run, x)); // which just runs x->run()
Run Code Online (Sandbox Code Playgroud)
从提供的示例中复制(带有修改)此模式.当用户按下按钮取消websocket时,我应该如何正确清理?我目前在做:
x->stop();
Run Code Online (Sandbox Code Playgroud)
我也应该打电话x->close()吗?在打电话close之前我是否需要等待stop?我是否需要杀死thread已创建的内容,还是会自动停止?我有关于当前代码离开websocket会话的报告.
我想在Hackage上找到从给定包导入给定模块的所有模块.作为一个有用的原因的例子,我想看看Language.Haskell.HLint从hlint包中导入的所有模块,因为我想弃用该模块,但我对它当前的使用方式感兴趣.
是否有任何索引(理想情况下是在线)跟踪此类导入关系?
我有一个Haskell程序,我想用GHC编译,由Shake构建系统编排.我应该执行哪些命令,以及在什么情况下应该重新运行?
我想将Haskell模块编译为GHC Core,并应用优化,并使用生成的核心输出.但是,当我使用compileToCoreSimplified它时似乎没有运行所有正常的优化.参加该计划:
{-# OPTIONS_GHC -O2 #-}
module LensOpt(pick) where
import Control.Lens
data Record = Record {_field :: String}
field = lens _field $ \r x -> r{_field=x}
pick = Record "test" ^. field
Run Code Online (Sandbox Code Playgroud)
运行时,ghc -ddump-simple我得到最佳输出:
LensOpt.pick1 :: GHC.Prim.Addr#
LensOpt.pick1 = "test"#
pick :: String
pick = GHC.CString.unpackCString# LensOpt.pick1
Run Code Online (Sandbox Code Playgroud)
但是,当使用compileToCoreSimplified我得到输出编译时:
s1 :: Addr#
s1 = "test"#
s2 :: [Char]
s2 = unpackCString# s1
s3 :: Record
s3 = Record s2
pick :: String
pick = …Run Code Online (Sandbox Code Playgroud) 我正在forkIO使用以下代码进行基准测试:
import System.Time.Extra
import Control.Concurrent
import Control.Monad
import Data.IORef
n = 200000
main :: IO ()
main = do
bar <- newEmptyMVar
count <- newIORef (0 :: Int)
(d, _) <- duration $ do
replicateM_ n $ do
forkIO $ do
v <- atomicModifyIORef' count $ \old -> (old + 1, old + 1)
when (v == n) $ putMVar bar ()
takeMVar bar
putStrLn $ showDuration d
Run Code Online (Sandbox Code Playgroud)
这会产生 20K 个线程,计算有多少线程使用IORef,当它们全部启动时,完成。使用该命令在 Windows 上的 GHC 8.10.1 上运行时 …
haskell ×6
ghc ×2
.net ×1
c# ×1
concurrency ×1
ghc-api ×1
hackage ×1
idris ×1
lifetime ×1
performance ×1
rust ×1
websocket++ ×1