小编J F*_*sch的帖子

如何将System.IO.Unsafe与TVars一起使用?

我想打电话给一个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)

haskell

3
推荐指数
1
解决办法
154
查看次数

抑制运行时错误"模式Data.Maybe.Just b"的Irrefutable模式失败

我有以下功能:

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总是匹配.

我试图测试队列是否为空,然后在我的函数中对它进行操作但是这使整个事情运行速度慢了两倍.

因为这显然没有伤害这个错误可以用某种方式用例如编译器选项来抑制,或者我需要捕获异常然后忽略它(这也可能花费额外的时间).

haskell

3
推荐指数
2
解决办法
744
查看次数

为什么数据类型不能序列化,尽管它是show class的成员?

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

3
推荐指数
1
解决办法
233
查看次数

Haskell和Multicore,真正发生了什么

当你想在Haskell中使用多个核心时,我试着理解真正发生了什么.给了一个很好的介绍,但恕我直言并不是非常关键,并留下许多问题.

当我在我的代码中使用par combinator或forkIO并使用-threaded标志编译它时,最终决定我是否获得OS线程?是编译器还是操作系统?

如果我使用应始终创建操作系统线程的forkOS,那是否会让我从底层操作系统的功能中解脱出来?

为了澄清我的问题:我假设在多核世界中,底层/已安装的操作系统在其可以理解和使用的核心数量方面存在局限性.我在Haskell中所做的一切是否被操作系统的功能所截断?或者,有没有什么方法(它​​们是什么?)在某种意义上要比操作系统更好,如果主机有12个内核且操作系统主机8,我可以通过在Haskell中编写智能应用程序来推动它,或者我使用此操作系统在此主机上运行的所有内容仅限于智能使用8个内核?

haskell

2
推荐指数
1
解决办法
510
查看次数

共享可变状态:何时使用IORefs

我有一个写入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)

haskell shared-state ioref

2
推荐指数
1
解决办法
340
查看次数

Reader Monad和类型变量

我有以下内容:

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)

haskell

2
推荐指数
1
解决办法
174
查看次数

重构没有-XScopedTypeVariables

我有一个函数(在一个模块中)返回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类的成员然后打印它我可以测试的任何方式.如果不做别的事.

haskell

2
推荐指数
1
解决办法
1008
查看次数

加密和ByteString边界

我有以下测试应用程序:

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阵列时.

encryption haskell aes

2
推荐指数
1
解决办法
619
查看次数

在Haskell中实现DSL

这可能是一个非常基本的问题.

我正在制作一个最终允许我说的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,而不会回归到只有普通的库.

haskell

2
推荐指数
1
解决办法
1227
查看次数

我的表演课去了哪里

我有以下定义

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可打印?

haskell

2
推荐指数
1
解决办法
103
查看次数

标签 统计

haskell ×10

aes ×1

encryption ×1

ioref ×1

shared-state ×1