如果发生某个模式,我正在尝试将包含i和OS的数组拆分。
假设我有一个输入,看起来像这样:
data Bit = O | I deriving (Eq, Show)
let b = [I,I,O,O,O,O,O,I,I,O,O,O,I,O]
这就是我正在生成的,当编码[[Bool]] -> [Bit]
相应的输入到我的编码函数时,将是let a = [[True, False, False, True],[False, False],[False]]
现在我的目标是解码IVE生成的内容,因此我需要一个使我从B到A。
的函数但是,每当它读取i,o或i,i时,我都无法提出将B列表分为3个sublists的方法。每个奇数字母都代表以下成员或启动数组成员。我基本上是在复制UTF Unicode编码。
因此,我正在尝试构建一个可以使我从B到A的函数。一段时间后,我想到了:
split :: [Bit] -> [[Bit]]
split (x1:x2:xs) = if (x1 == I)
then [x2 : split xs]
else x2 : split xs
我不知道如何将列表分成sublist。非常感谢任何类型的建议/帮助/代码
编辑:
split :: [Bit] ->[[Bit]]
split [] = []
split xs = case foo xs of (ys,I,x2) -> -- generate new subarray like [...,[x2]]
(ys,O,x2) -> -- append existing subarray with value x2 [.....,[previous values]++x2]
foo :: [a] -> ([a],x1,x2)
foo x1:x2:input = (input,x1,x2)
这两个评论是我需要找出的最后一件事。之后我完成了:)
如果将 b
馈送到函数 split
,我想要这个ouput: [[I,O,O,I],[O,O],[O]]
最后一步是从B到[[True, False, False, True],[False, False],[False]]
我将从 if (x1 == 1) ...
如果x1
是可以是I
或O
的Bit
,为什么要将其平等与Num
,1
?
如果我做对了,则需要:
split [] = []
split xs = case foo xs of (ys,r) -> r : split ys
foo :: [a] -> ([a],r)
foo = undefined
在foo
中,列表应部分消耗,并返回列表的其余部分以及要收集的值。
编辑:
data Bit = O | I deriving (Eq, Show)
sampleA = [[True, False, False, True],[False, False],[False]]
sampleB = [I,I,O,O,O,O,O,I,I,O,O,O,I,O]
type TwoBit = (Bit,Bit)
twobit (x:y:xs) = (x,y) : twobit xs
twobit _ = []
split :: [TwoBit] -> [[Bool]]
split [] = []
split xs = case spli xs of (ys,r) -> r : split ys
where
spli :: [TwoBit] -> ([TwoBit],[Bool])
spli (x:xs) = case span (not . pterm) xs of
(ys,zs) -> (zs, map ptrue $ x:ys)
pterm x = (I,O) == x || (I,I) == x
ptrue x = (O,I) == x || (I,I) == x
splitTB = split . twobit
main = print $ splitTB sampleB == sampleA
PS函数看起来像s -> (s,a)
也可以表示为状态单。