在Haskell中,在Elixir / Erlang的位串上匹配的“ binary-size(N)”模式等效

我可以在Elixir或Erlang中做到这一点:

s = "my binary string"
<<head::binary-size(6),_rest::binary>> = s     
head ===> "my bin"


s2 = <<18,22,13,44,52,99>>                  
<<head2::binary-size(4),_rest::binary>> = s2
head2 ===> <<18,44>>

也就是说,headhead2是我感兴趣的结果变量。

我熟悉Haskell的binary库。我还没有找到等效的功能-https://hackage.haskell.org/package/binary-0.10.0.0/docs/Data-Binary-Get.html#t:Get

在Haskell中,特别是在binary库中,有没有办法做同样的事情?

zgyanfeng 回答:在Haskell中,在Elixir / Erlang的位串上匹配的“ binary-size(N)”模式等效

Haskell binary中的等效功能是the getByteString function

getByteString :: Int -> Get ByteString

getByteString 6 :: Get ByteString

example = runGet (getByteString 6) "my binary string" :: ByteString

使用do标记组成Get解析器。还有getRemainingLazyByteString可以获取字节串的其余部分,但是请注意,尽管它对于Elixir / Erlang样式的解析很有用,但在Haskell的解析器组合中却包含了大部分内容:

getThreeBS :: Get (ByteString,ByteString,ByteString)
getThreeBS = do
  x <- getByteString 2
  y <- getByteString 3
  z <- getRemainingLazyByteString
  return (x,y,z)

example1 = runGet getThreeBS "Hello World!"  -- ("He","llo"," World!")

另一个相关功能是Control.Monad.replicateM

replicateM :: Int -> Get a -> Get [a]

example2 = runGet (replicateM 5 getWord8) (ByteString.pack [18,22,13,44,52,99]) :: [Word8]
本文链接:https://www.f2er.com/2377901.html

大家都在问