首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等效于“二进制大小(N)”模式匹配在哈斯克尔中的一位字符串的Elixir/Erlang

等效于“二进制大小(N)”模式匹配在哈斯克尔中的一位字符串的Elixir/Erlang
EN

Stack Overflow用户
提问于 2020-04-23 06:59:08
回答 1查看 155关注 0票数 1

我可以用药剂或Erlang这样做:

代码语言:javascript
复制
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, 22, 13, 44>>

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

我熟悉哈斯克尔的binary库。我还没有在它中找到类似的功能- https://hackage.haskell.org/package/binary-0.10.0.0/docs/Data-Binary-Get.html#t:Get

在Haskell中,特别是在binary库中,有方法可以这样做吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-23 07:09:43

Haskell binary中的等效特性是the getByteString function

代码语言:javascript
复制
getByteString :: Int -> Get ByteString

getByteString 6 :: Get ByteString

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

使用do-表示法组成Get解析器.还有getRemainingLazyByteString来获取字节字符串的其余部分,但是要注意,尽管它对于Elixir/Erlang风格的解析很有用,但在Haskell中,解析器的组合包含了其中的大部分内容:

代码语言:javascript
复制
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

代码语言:javascript
复制
replicateM :: Int -> Get a -> Get [a]

example2 = runGet (replicateM 5 getWord8) (ByteString.pack [18, 22, 13, 44, 52, 99]) :: [Word8]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61381134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档