我想打电话给一个UDP的STM事务中发送函数,这样我才能避免类似下面的代码,其中M"被读取(可能是由其他线程更新)之前最终被送到与其中两个连续的where子句让我的价值观看起来很"无奈".
sendRecv s newmsgs q m = do
m' <- atomically $ readTVar m
time <- getPOSIXTime
result <- appendMsg newmsgs key m
when (result > 0) (atomically $ do
mT <- readTVar m
qT <- readTVar q
--let Just messages = Map.lookup key mT in sendq s (B.pack $ unwords messages) "192.168.1.1" 4711
let mT' = Map.delete key mT
qT' = PSQ.delete key qT
writeTVar q (PSQ.insert key time qT')
writeTVar m (Map.insert key [newmsgs] mT'))
when (result > …Run Code Online (Sandbox Code Playgroud) 我有以下功能:
loopMyQ s q m = forever $ do
q' <- atomically $ readTVar q
let Just b = PSQ.findMin q' --irrefutable pattern here in case the queue has just been created
duetime = (PSQ.prio b) + 2.000
now <- getPOSIXTime
when (now > duetime) (transMit2 s now q m)
Run Code Online (Sandbox Code Playgroud)
问题是,当PSQ"刚刚"被创建为空PSQ时,Just无法匹配并在运行时给出了无可辩驳的模式错误.这恰好发生一次,因为显然队列后来被填充并且只是b总是匹配.
我试图测试队列是否为空,然后在我的函数中对它进行操作但是这使整个事情运行速度慢了两倍.
因为这显然没有伤害这个错误可以用某种方式用例如编译器选项来抑制,或者我需要捕获异常然后忽略它(这也可能花费额外的时间).
data Mine = Firstname String
| Lastname String
deriving (Show, Serialize)
Run Code Online (Sandbox Code Playgroud)
这不编译并给出错误
Not in scope: type constructor or class `Serialize'
Run Code Online (Sandbox Code Playgroud)
为什么它不是Serialize类的成员,尽管它是Show类的成员.我认为Show类的所有成员应该没有问题序列化?
当你想在Haskell中使用多个核心时,我试着理解真正发生了什么.这给了一个很好的介绍,但恕我直言并不是非常关键,并留下许多问题.
当我在我的代码中使用par combinator或forkIO并使用-threaded标志编译它时,最终决定我是否获得OS线程?是编译器还是操作系统?
如果我使用应始终创建操作系统线程的forkOS,那是否会让我从底层操作系统的功能中解脱出来?
为了澄清我的问题:我假设在多核世界中,底层/已安装的操作系统在其可以理解和使用的核心数量方面存在局限性.我在Haskell中所做的一切是否被操作系统的功能所截断?或者,有没有什么方法(它们是什么?)在某种意义上要比操作系统更好,如果主机有12个内核且操作系统主机8,我可以通过在Haskell中编写智能应用程序来推动它,或者我使用此操作系统在此主机上运行的所有内容仅限于智能使用8个内核?
我有一个写入Map和PSQ的主线程.在Map和PSQ中,我使用相同的密钥,以便通过查看PSQ,可以找到具有最小优先级的条目,其具有O(1)复杂度并且被映射到Map中的值.
现在,当我的主线程在需要时添加/修改Map和PSQ时,我有第二个线程,它经常(forever $ do)查看PSQ以确定最旧的键何时是N ms之前然后应该刷新它.
为此,两个线程都需要查看相同的可变数据.维持国家的最佳方式是什么?这是IOREfs的案例吗?还有什么方法可以解决这个问题?
这里的"一些"pre-alpha代码:
import Data.Time
import Data.Functor
import Data.Time.Clock.POSIX
import qualified Data.PSQueue as PSQ
import qualified Data.Map as Map
import Data.Maybe
import Control.Concurrent
import Control.Concurrent.MVar
import Control.Monad
import Network.Socket hiding (send, sendTo, recv, recvFrom)
import Network.Socket.ByteString
import qualified Data.ByteString.Char8 as B
--PSQ = (host, PID) POSIXTime
--where the tuple is k and POSIXTime is p
--Map is (host, PortNumber) [messages]
--where the tuple is the key and [messages] is a list of messages
key …Run Code Online (Sandbox Code Playgroud) 我有以下内容:
type KEY = (IPv4, Integer)
type TPSQ = TVar (PSQ.PSQ KEY POSIXTime)
type TMap a = TVar (Map.Map KEY [a])
data Qcfg a = Qcfg { qthresh :: Int, tdelay :: Rational, cwpsq :: TPSQ, cwmap :: TMap a
, cwchan :: TChan String }
getTMap = do
c <- ask
return (cwmap c)
Run Code Online (Sandbox Code Playgroud)
并获得有关Reader Monad的错误:
No instance for (MonadReader (Qcfg a2) m2)
arising from a use of `ask'
Possible fix:
add an instance declaration for (MonadReader (Qcfg a2) …Run Code Online (Sandbox Code Playgroud) 我有一个函数(在一个模块中)返回IO (Maybe a)a的实例Serialize.
从我的主程序我这称之为:
msg <- fun token
print msg
Run Code Online (Sandbox Code Playgroud)
并得到错误
Ambiguous type variable `a0' in the constraints:
(Data.Serialize.Serialize a0) arising from a use of `foo'
at test_00.hs:13:15-19
(Show a0) arising from a use of `print' at test_00.hs:17:9-13
Probable fix: add a type signature that fixes these type variable(s)
Run Code Online (Sandbox Code Playgroud)
我确切地知道问题是什么,我可以使用-XScopedTypeVariables来修复它,以及我如何调用我的库函数的一些更改,如下所示:
(msg :: Maybe String) <- cwPop token
print msg
Run Code Online (Sandbox Code Playgroud)
但是,我宁愿避免使用ScopedTypeVariables,并想知道如果msg是show类的成员然后打印它我可以测试的任何方式.如果不做别的事.
我有以下测试应用程序:
import Codec.Crypto.AES
import qualified Data.ByteString.Char8 as B
key = B.pack "Thisismykey....."
iv = B.pack "0000000000000001"
main = do
let myenc = crypt' CTR key iv Encrypt (B.pack "1234567812345678")
print (B.unpack myenc)
Run Code Online (Sandbox Code Playgroud)
这将打印以下结果:"\ 250\DC4\DC4\255\223\221C\ETBx\239sF \nuZu"
如果我将明文"1234567812345678"更改为"1234567812345688",我会收到"\ 250\DC4\DC4\255\223\221C\ETBx\239sF \nuUu"
如果我将明文更改为"1134567812345678",我得到输出"\ 250\ETB\DC4\255\223\221C\ETBx\239sF \nuZu"
我现在非常惊讶,因为恕我直言不应该发生输入和输出之间的可预测的相关性.如果我在明文的前面改变了一些东西,那么只有输出的前面受到影响等等.可能是某种方式与字节字符串的8或16字节边界有关,我该如何解决这个问题呢?在这里误导我的是什么?
独立于CTR模式,应该注意到AES与4x4字节阵列一起工作,问题是关于单个阵列的加密.根据我的理解,AES应该执行四轮混合,并且单个字节(16个中的一个)的改变应该导致至少50%的比特不同.因此,在我看来,它可以不是16字节明文末尾的变化恰好改变了密文的结尾和前面的变化改变了前面等等.据我所知,IV只作为一个计数器发挥作用当涉及多个4x4阵列时.
这可能是一个非常基本的问题.
我正在制作一个最终允许我说的DSL:
import language.cwmwl
main = runCWMWL $ do
eval ("isFib::", 1000, ?BOOL)
Run Code Online (Sandbox Code Playgroud)
我刚刚开始研究解释函数runCWMWL,我想知道是否有可能以某种方式逃避真正的Haskell(以及如何?)在do-block内部或外部.
我想print在我的解释器中为一些必需的前奏函数(例如)提供一个defautl-wrapper,但是我想知道是否有更优雅的方法可以共同放弃DSL和Haskell,而不会回归到只有普通的库.
我有以下定义
data AST
= Number Integer
| Identifier String
| String String
-- | Operation BinOp AST AST
| Query String
deriving (Show, Eq)
data Tuple = Tuple {cmd :: String,
cid :: AST,
argumentList :: [AST],
queryList :: [AST]} deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)
当我尝试打印例如cid我得到错误
No instance for (Show (Tuple -> AST)) arising from a use of `print'
Run Code Online (Sandbox Code Playgroud)
这让我感到惊讶,因为AST和Tuple都是秀类的成员.如何使cid,argumentList和queryList可打印?