我正在尝试在使用该Network.Socket模块构造的套接字上设置接收超时.这是一段代码片段:
import Network.Socket
host = "127.0.0.1"
port = PortNumber 3000
main = do
addrinfos <- getAddrInfo Nothing (Just host) (Just port)
let serveraddr = head addrinfos
sock <- socket (addrFamily serveraddr) Stream defaultProtocol
setSocketOption sock RecvTimeOut 120000000
connect sock (addrAddress serveraddr)
msg <- recv sock 1024
putStrLn msg
sClose sock
Run Code Online (Sandbox Code Playgroud)
该setSocketOption行引发异常:
*** Exception: setSocketOption: invalid argument (Invalid argument)
Run Code Online (Sandbox Code Playgroud)
setSocketOption只接受Int设置的参数,但不是所有的套接字选项都需要Int.具体而言RecvTimeOut,SendTimeOut期待一个struct timeval.还有另一种方法可以从haskell设置这些选项吗?
我在OSX 10.8.1上运行GHC 7.4.2
编辑:
Network.Socket.Options …
我正在开发一些运行在raspberry pi 2上的haskell项目和ghc的版本,你可以用rasp-get(7.4.1)安装apt-get.它没有GHCi,这可以防止一些重要的包(如Vector)编译.我已经看到一些关于能够将更高版本的ghc(带有ghci)放到pi上的传言,但最近没有.haskell wiki上的条目看起来已经过时了几年.有人有运气吗?
这是我正在尝试做的简化示例.我有两张桌子,A和B.
A B
----- -----
id id
name a_id
value
Run Code Online (Sandbox Code Playgroud)
我想只选择A中的行,其中B中行的所有值都与where子句匹配.就像是:
SELECT * from A INNER JOIN B on B.a_id = A.id WHERE B.value > 2
Run Code Online (Sandbox Code Playgroud)
上述查询的问题是,如果B中的任何行的值> 2,我将从A获得相应的行,而我只想要来自A的行
1.)ALL B中的行为B.a_id = A.id匹配WHERE,OR
2.)B中没有引用A的行
B基本上是一个过滤器表.
我有一个x,y点列表存储为矢量矢量,我想找出界限.
例如,鉴于此:
[[0 0] [20 30] [-50 -70] [200 300]]
Run Code Online (Sandbox Code Playgroud)
结果将是:
{:x -50, :y -70, :x2 200, :y2 300}
Run Code Online (Sandbox Code Playgroud)
这是我到目前为止所拥有的.它给出了理想的结果,但看起来很冗长,而且对我来说并不是很好.
(defn get-stroke-bounds [vector-of-points]
(reduce (fn [m [x y]]
{:x (min (:x m Integer/MAX_VALUE) x)
:y (min (:y m Integer/MAX_VALUE) y)
:x2 (max (:x2 m Integer/MIN_VALUE) x)
:y2 (max (:y2 m Integer/MIN_VALUE) y)})
{}
(vector-of-points)))
Run Code Online (Sandbox Code Playgroud)
关于如何改进它的任何想法?谢谢!
假设我有一个记录,其中一个值是一个MVar:
data SomeRecord = SomeRecord { frobs :: MVar Integer }
Run Code Online (Sandbox Code Playgroud)
我希望能够使用Aeson从JSON编码/解码它.在编码时,MVar将被解包并且原始值被编码,并且在解码时将发生相反的情况.
能够只写一个返回的IO (Maybe SomeRecord)FromJSON实例和一个返回的ToJSON实例会很好IO ByteString,但由于Parser monad不是MonadIO的实例,我认为不可能.
到目前为止,我已经尝试编写函数来在MVar-encumbered记录和几乎没有MVar类型的相同记录之间进行转换,然后对其进行编码/解码.
我试图找到一些方法来保持MVar首先脱离我的记录.这似乎是理想的.但是假设我出于某种原因无法做到这一点,是否有更简单的方法来处理JSON编码/解码?
编辑:
我想知道我是不是在问错误的问题.也许我的整个方法都不正确.我要做的是允许一堆连接的客户端(每个在不同的线程上)添加/编辑/删除对象列表.这是类型的样子:
-- the data type for each "room"
data Instance = Instance
{ iName :: T.Text
, iObjects :: M.HashMap T.Text (MVar Store)
...
}
-- the data type for a particular object in the room that can be changed
data Store = Store
{ sObject :: A.Value
...
}
Run Code Online (Sandbox Code Playgroud)
每个"房间"都有一个Instance房间对象.实例本身位于MVar中以同步iObjects散列映射的添加/删除,并且每个单独的存储都在MVar中,以便在更新单个对象时不必阻止整个数据结构.
所以更新操作如下所示: …