使用模式识别,Haskell拆分列表将其分为子列表



如果发生某个模式,我正在尝试将包含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是可以是IOBit,为什么要将其平等与Num1

进行比较

如果我做对了,则需要:

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)也可以表示为状态单。

相关内容

  • 没有找到相关文章

最新更新