小编J F*_*sch的帖子

为什么这些模式匹配重叠?

为什么我的模式匹配do块重叠?

 (q, m) <- newRq
 let m2 = appendMsg "first" key m
     (q4, m4) = case m2 of   
               m -> deleteRec key q m2
               _ -> (q, m2)
Run Code Online (Sandbox Code Playgroud)

这会编译警告

Warning: Pattern match(es) are overlapped
         In a case alternative: _ -> ...
Run Code Online (Sandbox Code Playgroud)

并没有按我的意愿行事.似乎对于(q4,m4)它总是返回

[], fromList []
Run Code Online (Sandbox Code Playgroud)

无视m2和m的值是什么.有没有我不期望的局部变量?

我希望用文字来实现:如果m2和m相等,则(q4,m4)应评估为deleteRec key q m2,否则为(q,m2).

haskell

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

这是foldM的案例吗?

sendrecv函数具有以下类型签名:

sendrecv :: Socket ->
            PSQ.PSQ (String, Integer) POSIXTime ->
            Map.Map (String, Integer) [String] ->
            String ->
            IO  (PSQ.PSQ (String, Integer) POSIXTime,  Map.Map (String, Integer) [String]) 
Run Code Online (Sandbox Code Playgroud)

它需要一个套接字,一个PSQ,一个Map和一个String,并返回一个PSQ和一个Map.

我想把它调用n次,其中套接字和字符串保持不变,但PSQ和Map得到修改,意味着修改后的PSQ,Map应该成为下一次运行的输入.

最初我认为这可能是foldM的完美案例,并尝试过例如

(q', m') <- foldM sendrecv (s, q1, m1, "ping") (enumFromTo 1 1000)
Run Code Online (Sandbox Code Playgroud)

但显然这不起作用,我担心我还没有理解整个foldM的事情,或者是否有可能传递静态参数(如s和"ping")以及如何.

haskell

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

拆分IO和计算

我想接收一个字符串,将其转换为列表并将列表的每个元素写入TChan.对于收到的每个字符串,我想分叉一个新进程.

我的问题是,当我尝试编译时,我得到与IO相关的错误:

Couldn't match expected type `IO ()' with actual type `[()]'
Run Code Online (Sandbox Code Playgroud)

要么

Couldn't match expected type `IO ()' with actual type `[IO ()]'
Run Code Online (Sandbox Code Playgroud)

虽然我完全理解错误并知道它的起源(至少是第一个错误 - )但我现在已经没有想法如何在我的示例中拆分IO计算并仍然实现我尝试做的事情.

write2TChan msg mtch = do
        let mymessages = words msg
        map (\x -> atomically $ writeTChan mtch x) mymessages
        return ()

main = withSocketsDo $ do
        s <- socket AF_INET Datagram defaultProtocol
        bindAddr <- inet_addr host
        bindSocket s (SockAddrInet port bindAddr)
        mtch <- newTChanIO
        let forever socket hosts = do
                (msg, host) <- …
Run Code Online (Sandbox Code Playgroud)

haskell

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

如何删除锅炉板代码

我想减少以下锅炉板代码,但不使用镜头(Data.Label).我怎么能这样做呢?

data Qcfg = Qcfg { qthresh :: Int, tdelay :: Rational, cwpsq :: TPSQ, cwmap :: TMap, cwchan :: TChan String }

getQthresh = do
   c <- ask
   return (qthresh c)

getDelay = do
   c <- ask
   return (tdelay c)

getTMap = do
   c <- ask
   return (cwmap c)

getTPsq = do
   c <- ask
   return (cwpsq c)

getTChan = do
    c <- ask
    return (cwchan c)
Run Code Online (Sandbox Code Playgroud)

haskell

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

什么是正确使用Data.Serialize"Either String"

我有Data.Serialize的问题.当我编码数据结构时,我可以编码作为Serialize类实例的所有数据结构.这非常有效.

然后我通过网络发送它.

但是,解码时遇到问题.解码函数给我一个称为" Either String" 的类型,我不太确定如何进一步使用它来重建我的原始数据结构,因为收件人只知道它以前是一个实例Serialize.

receiveMessage :: Socket -> IO (a, SockAddr)
receiveMessage s  = do
        (msg, remoteSockAddr) <- recvFrom s 512
        return (S.decode $ msg, remoteSockAddr)

  Couldn't match type `a' with `Either String a0'
      `a' is a rigid type variable bound by
          the type signature for receiveMessage :: Socket -> IO (a, SockAddr)
    In the expression: decode $ msg
    In the first argument of `return', namely
      `(decode $ msg, remoteSockAddr)'
    In the expression: return (decode …
Run Code Online (Sandbox Code Playgroud)

haskell

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

奇怪的可能出现在元组类型中

我有下面的演示代码无法编译错误:

Occurs check: cannot construct the infinite type: p0 = Maybe p0
    Expected type: PSQ.PSQ (t1, t2, (t0, [a0])) (Maybe p0)
      Actual type: PSQ.PSQ (t1, t2, (t0, [a0])) p0
    In the third argument of `PSQ.insert', namely `q'
    In the expression: PSQ.insert test' time q
Run Code Online (Sandbox Code Playgroud)

如果我从AppendMsg中创建代码的主要编译部分.如果试图使它成为一个单独的函数,它就会失败并出现奇怪的相关错误.我不太确定可能的类型来自哪里.我试图解决它,例如让time = Just (PSQ.lookup test time)但没有快乐.我没有Data.Label /镜头试过它但也没有喜悦.即使是插入附加消息的非常简单的功能也会产生相同的错误.

这可能有什么问题?

import Data.Time
import Data.Time.Clock.POSIX
import qualified Data.PSQueue as PSQ
import Data.Maybe
import Data.Label
import Control.Category
import Prelude hiding ((.))

test = ("192.168.1.1", 3455, (1234566, msgs))
msgs …
Run Code Online (Sandbox Code Playgroud)

haskell

0
推荐指数
1
解决办法
256
查看次数

如何在State Monad中定义初始状态?

我在http://www.haskell.org/haskellwiki/State_Monad上发现了这一点, 但我不清楚如何定义c和f的初始状态.

它适用于IORefs,但我不需要全局可变数据.

increment :: StateT Integer IO Integer
increment = do
        n <- get 
        put (n+1)
        return n

plusOne :: Integer -> IO Integer
plusOne n = execStateT increment n   

printTChan mtch = do
        forever $ do
        m <- atomically $ readTChan mtch
        case m of
             "ping" -> plusOne c
             _ -> plusOne f
        print (c)
Run Code Online (Sandbox Code Playgroud)

haskell

0
推荐指数
1
解决办法
160
查看次数

标签 统计

haskell ×7