【问题标题】:Return List of Lists of 3 tuples using recursion in Haskell在 Haskell 中使用递归返回 3 个元组的列表
【发布时间】:2019-03-19 07:14:19
【问题描述】:

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

我被卡住了,我不确定如何继续或使用递归来实现此功能。

【问题讨论】:

  • 为什么这个被包裹在一个额外的列表中?为什么[[(Bool, Bool, Bool)]] 而不仅仅是[(Bool, Bool, Bool)]
  • @WillemVanOnsem 因为我在一个列表中返回多个列表
  • 但是你的元组只能包含 一个 列表,所以这里没有理由将它包装在另一个列表中:inner 列表将始终是一个单例列表(包含一个元素),因此您有一个类型可以提供 less 约束。
  • 这个函数的目的是什么?您提供的示例仅返回作为参数传递的相同内容,因此我看不到递归在哪里以及两个整数参数如何影响函数。

标签: haskell recursion


【解决方案1】:

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

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 元组包装在另一个列表中,例如 pure :: Applicative f => a -> f a。这里我们 map 列表中的每个元素(此类元素在 singleton 列表中具有 (Bool, Bool, Bool) 类型,因此:

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

但我个人认为这没有任何好处:因为现在看起来结果的每个元素都是一个列表,并且该列表可以 - 给定定义 - 包含零个、一个或多个元素。但由于我们确定它包含 恰好一个元素,因此最好将它包装在一个列表中。

【讨论】:

    猜你喜欢
    • 2020-01-22
    • 2014-04-02
    • 2018-02-20
    • 2020-10-19
    • 1970-01-01
    • 2013-12-05
    • 2013-01-17
    • 1970-01-01
    • 2019-03-18
    相关资源
    最近更新 更多