Haskell 中的二进制文件和位串的模式匹配/解构类似于 Elixir/Erlang 中的一个
Pattern matching / deconstruction of binaries and bitstrings in Haskell that's similiar to the one of Elixir/Erlang
在 Elixir/Erlang 中,可以对二进制文件和位串进行这种模式匹配/解构:
def func1(my_data) do
<<
1,
44,
a::little-32,
b::little-64,
c,
d::64-little,
e::32-little-float,
rest::binary
>> = my_data
# using a, b, c, d, e, rest
end
我在 Haskell 中没有找到这样做的方法。 Haskell有开箱即用的容量吗?还是需要使用一些第三方库?
没有开箱即用的东西,但是可以将类似的东西实现为具有模式同义词的库,所以它看起来像这样:
-- For some definition of (:.)
case myData of
(1 :: Word8) :.
(44 :: Word8) :.
(a :: Little32) :.
(b :: Little64) :.
(c :: Word8) :.
(d :: Little64) :.
(e :: LittleFloat32) :.
rest ->
{- using a, b, c, d, e, rest -}
完整要点https://gist.github.com/Lysxia/8ee6b9debd613b988023d5a0a8dfd9cc
在 Haskell 中,我们通常更喜欢像 binary package.
这样的解析器组合器库
在 Elixir/Erlang 中,可以对二进制文件和位串进行这种模式匹配/解构:
def func1(my_data) do
<<
1,
44,
a::little-32,
b::little-64,
c,
d::64-little,
e::32-little-float,
rest::binary
>> = my_data
# using a, b, c, d, e, rest
end
我在 Haskell 中没有找到这样做的方法。 Haskell有开箱即用的容量吗?还是需要使用一些第三方库?
没有开箱即用的东西,但是可以将类似的东西实现为具有模式同义词的库,所以它看起来像这样:
-- For some definition of (:.)
case myData of
(1 :: Word8) :.
(44 :: Word8) :.
(a :: Little32) :.
(b :: Little64) :.
(c :: Word8) :.
(d :: Little64) :.
(e :: LittleFloat32) :.
rest ->
{- using a, b, c, d, e, rest -}
完整要点https://gist.github.com/Lysxia/8ee6b9debd613b988023d5a0a8dfd9cc
在 Haskell 中,我们通常更喜欢像 binary package.
这样的解析器组合器库