haskell - 高效匹配 Haskell 中的大量模式

标签 haskell pattern-matching packet

我曾想过将 Haskell 用于游戏服务器,但在编码时,我发现自己在查看解析数据包的部分时会想“哇,这将导致很多模式匹配”。看到要完成的匹配数量很多(走到那里,攻击那个,掠夺那个,打开那个,等等)。

我要做的是:

  • 接收数据包
  • 将数据包头解析为十六进制字符串(例如“02B5”)
  • 从数据包中获取剩余数据
  • parseIO 中的匹配 header
  • 使用数据包内容调用相应的函数

  • 映射 String -> 方法很容易,但是这些方法的参数数量不同。

    我想到了下面显示的两种简单的模式匹配方式。
    #1
    packetIO :: String -> IO ()
    packetIO packet =
      case packet of
        "02B5" -> function1
        "ADD5" -> function2
        ... and so on
    
    #2
    packetIO :: String -> IO ()
    packetIO "02B5" = function1
    packetIO "ADD5" = function2
    ... and so on
    

    从性能和编码风格两方面来看,有没有办法更好地处理从客户端收到的数据包?

    如果您有任何我找不到的资源或链接,请指出我的方向!

    编辑 130521 :

    似乎下面列出的两种替代方案都是不错的选择。只是等待在评论中看到我的问题的答案,然后再选择最适合我的解决方案。
  • 将 (ByteString -> Function) 存储在 Map 结构中。 O(log n)
  • 将 ByteString 转换为 Word16 和模式匹配。 O(log n) 通过树或 O(1) 通过查找表

  • 编辑 130521 :

    正如 Philip JF 所说,决定使用 Word16 进行模式匹配。
    两者都是很好的选择,虽然我的猜测是同样快,但 Map 可能会更快,因为我不必转换为 Word16,另一个选项为我的使用提供了更具可读性的代码:
    packetIO 0x02B5 = function1
    packetIO 0xADD5 = function2
    etc
    

    最佳答案

    为什么不解析为数字(Word16 中的 Data.Word ?)然后与之匹配,而不是使用字符串? Haskell 支持十六进制文字...

    关于haskell - 高效匹配 Haskell 中的大量模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16660211/

    相关文章:

    Haskell floor 函数返回不同的结果

    Haskell:从 P 树派生列表

    rust - 在采用 &self 或 &mut self 的函数中进行模式匹配时,如何避免 ref 关键字?

    regex - F# 正则表达式匹配链

    java - 在 linux 中记录键盘、鼠标 Activity

    c++ - boost::asio::udp 异步响应未完全收到

    haskell - 简单的Haskell阶乘函数未编译

    haskell - 如何在 Haskell 中监控计算过程

    scala - 从向量到各个变量的多重赋值

    python - 如何使用 tun/tap 接口(interface)拆分数据包、隧道然后重新组装。 (类似于 MLPPP)