Haskell - 布尔RoseTree

时间:2016-05-16 12:24:38

标签: haskell

Hello Haskell社区,

鉴于玫瑰树的通常定义:

RoseTree a = Node a [RoseTree a]

我一直在讨论这个特定功能的实现:

boolRoseTree :: Blocks -> Blocks -> RoseTree a -> Bool
boolRoseTree blocksA blocksB roseTree

Blocks只是一个[Int],它总是包含6个大于或等于0的元素。 现在我希望实现的函数检查blocksA的某个元素是否为某个值,blocksB的某个元素是否也是某个值,如果条件满足则返回True 。这是非常模糊的,所以请允许我用一个例子来澄清:

| (blocksA !! 0 == 1 || blocksA !! 0 == 10) && blocksB !! 1 /= 0 = True

即。如果blocksA的第一个元素是110blocksB的第二个元素不是0,则返回True。我想对blocksA的所有元素进行此操作,但每次元素都会增加+1。通过这个我的意思是下一个警卫将是:

| (blocksA !! 1 == 2 || blocksA !! 1 == 11) && blocksB !! 2 /= 0 = True
| (blocksA !! 2 == 3 || blocksA !! 2 == 12) && blocksB !! 3 /= 0 = True
| (blocksA !! 3 == 4 || blocksA !! 3 == 13) && blocksB !! 4 /= 0 = True
| (blocksA !! 4 == 5 || blocksA !! 4 == 14) && blocksB !! 5 /= 0 = True

显然,我可以使用一长串警卫进行编码,通过所有blocksA !! 0blocksA !! 1blocksA !! 2blocksA !! 3blocksA !! 4,{ {1}}最终到达blocksA !! 5语句,返回otherwise。但是,这可以通过玫瑰树更有效地完成(我认为)。

我想,在玫瑰树的第一层,必须有六个节点,0到5,代表树的元素。然后,每个节点必须有2个值,这是我在列表的特定元素处False所需的两个值 - 但是我还要以某种方式检查{{1}的相应元素不是零。

我真的不知道从哪里开始这样的问题......任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:1)

不知道玫瑰树在这里会起作用,但是这个怎么样 数据结构:

checks =
    [ ((0,0), [ (1, 10, 1) , (2, 11, 2) , (3, 12, 3) , (4, 13, 4) , (5, 14, 5) ])
    , ((1,..), [ ... ]
    , ((2,..), [ ... ]
    , ...
    , ((5,..), [ ... ]
    ]

以下是解构它的方法:

[ ( (0,0) [ (1, 10, 1) , (2, 11, 2) , (3, 12, 3) , (4, 13, 4) , (5, 14, 5) ]
     i z     x   y  j     x   y  j     x   y  j     ...

i z x y j <的每组值/ strong>对应 警卫:

| ((a !! i) == x || (a !! i) == y) && (b !! j /= z) = True

要执行所有检查,只需使用列表推导:

func :: [Int] -> [Int] -> Bool
func a b = or $ do ((i,z), triples) <- checks
                   (x,y,j) <- triples
                   return $ ((a !! i) == x || (a !! i) == y) && (b !! j /= z)

列表中的所有元素都在一起。由于懒惰,一旦遇到第一次True检查,函数将返回True。