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
的第一个元素是1
或10
且blocksB
的第二个元素不是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 !! 0
,blocksA !! 1
,blocksA !! 2
,blocksA !! 3
,blocksA !! 4
,{ {1}}最终到达blocksA !! 5
语句,返回otherwise
。但是,这可以通过玫瑰树更有效地完成(我认为)。
我想,在玫瑰树的第一层,必须有六个节点,0到5,代表树的元素。然后,每个节点必须有2个值,这是我在列表的特定元素处False
所需的两个值 - 但是我还要以某种方式检查{{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。