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

时间:2018-10-14 20:41:29

标签: haskell recursion

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

我被卡住了,不确定该函数如何继续使用或使用递归。

1 个答案:

答案 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 将其包装在列表中。