我是Haskell的新手。我正在尝试编写一个带有参数的递归函数:
([(Bool, Bool, Bool)], Int, Int)
并返回一个三元组列表列表:
[[(Bool, Bool, Bool)]]
例如调用
recursFunction ([(True, False, False), (False, True, False)], 25, 25)
应该返回
[[(True, False, False)],[(False,True,False)]]
到目前为止我有
recursFunction :: ([(Bool, Bool, Bool)], Int, Int) -> [[(Bool, Bool, Bool)]]
recursFunction ([], y, z) = [[]]
我被卡住了,不确定该函数如何继续使用或使用递归。
答案 0 :(得分:0)
您不需要使用递归。三元组的列表存储在第一个参数中,因此我们可以通过以下方式获取它:
$
此处recursFunction :: ([(Bool, Bool, Bool)], Int, Int) -> [[(Bool, Bool, Bool)]]
recursFunction (l, _,_) = ...
是布尔值列表,因此l
的类型为l
。如果输出类型仅为l :: [(Bool, Bool, Bool)]
,则可以返回:
[(Bool, Bool, Bool)]
否则,我们可以将每个3元组包装在另一个列表中,例如使用pure :: Applicative f => a -> f a
。在这里,我们recursFunction :: ([(Bool, Bool, Bool)], Int, Int) -> [(Bool, Bool, Bool)]
recursFunction (l, _,_) = l
列表中的每个元素(该元素在 singleton 列表中的类型为map
,因此:
(Bool, Bool, Bool)
但是我个人没有看到任何好处:因为现在看起来结果的每个元素似乎都是一个列表,并且给定定义,该列表可以包含零个,一个或多个元素。但是,由于我们肯定知道它确实包含 个元素,因此最好 not 将其包装在列表中。