在Haskell中使用递归返回3个元组的列表

在Haskell中使用递归返回3个元组的列表,haskell,recursion,Haskell,Recursion,我是哈斯克尔新手。我正在尝试编写一个递归函数,该函数接受以下参数: ([(Bool, Bool, Bool)], Int, Int) 并返回3元组列表的列表: [[(Bool, Bool, Bool)]] 例如,一个电话 recursFunction ([(True, False, False), (False, True, False)], 25, 25) 应该回来 [[(True, False, False)],[(False,True,False)]] 到目前为止我有 recurs

我是哈斯克尔新手。我正在尝试编写一个递归函数,该函数接受以下参数:

([(Bool, Bool, Bool)], Int, Int)
并返回3元组列表的列表:

[[(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) = [[]]

我被卡住了,我不知道如何继续或使用递归来实现这个函数。

您不需要使用递归。3元组列表存储在第一个参数中,因此我们可以通过以下方式获得:

recursFunction :: ([(Bool, Bool, Bool)], Int, Int) -> [[(Bool, Bool, Bool)]]
recursFunction (l, _,_) = ...
这里
l
将是布尔值的列表,因此
l
具有类型
l:[(Bool,Bool,Bool)]
。如果输出类型只是
[(Bool,Bool,Bool)]
,那么我们可以返回:

recursFunction :: ([(Bool, Bool, Bool)], Int, Int) -> [(Bool, Bool, Bool)]
recursFunction (l, _,_) = l
否则,我们可以将每个3元组包装在另一个列表中,例如使用。这里我们映射列表中的每个元素(此类元素在单例列表中具有类型
(Bool,Bool,Bool)
,因此:

recursFunction :: ([(Bool, Bool, Bool)], Int, Int) -> [[(Bool, Bool, Bool)]]
recursFunction (l, _,_) = map pure l

但就我个人而言,我看不出这有什么好处:因为现在看来,结果的每个元素都是一个列表,根据定义,该列表可以包含零个、一个或多个元素。但是,既然我们确定它只包含一个元素,那么最好不要将其包装在一个列表中。

为什么要将其包装在一个额外的列表中?为什么
[(Bool,Bool,Bool)]
而不仅仅是
[(Bool,Bool,Bool)]
?@WillemVanOnsem因为我在一个列表中返回多个列表,但您的元组只能包含一个列表,所以这里没有理由将其包装在另一个列表中:内部列表始终是一个单元素列表(包含一个元素),因此您得到了一个提供较少约束的类型。函数的用途是什么?您给出的示例仅返回作为参数传递的相同值,因此我不知道递归在哪里,以及两个整数参数如何影响函数。