繁体   English   中英

从另一个函数生成列表,该函数返回Haskell中的Bool

[英]Generate a list from another function which returns a Bool in Haskell

我目前正在处理列表(我们用来表示网格)的列表。 我有一个函数接收2个参数(我的网格和4个整数的元组),并且它返回一个布尔值。

现在有了一个新函数,我需要生成每个元组的列表,该列表在特定网格中返回True。 例如, function1 (1,3,2,2) grid1将返回True因此我需要在列表中获取(1,3,2,2)

另一个问题是我有多个条件要尊重我的4个整数的元组(a,b,c,d) ,例如: 1 <= a < a+c <= n and 1 <= b < b+d <= m ,其中n是行数(因此为长度网格), m为列数(因此为长度(头部网格))。

我有使用地图的想法,但到目前为止,在这种情况下我从未使用过地图,而我尝试的一切都失败了。

谢谢

在Haskell中,有两种基本方法可以做到这一点。

  1. 生成满足您列出的条件但不一定根据该函数返回true的元组流
  2. 使用filter缩小列表

或者我们可以尝试避免生成所有多余的数据,而只需要

  1. 首先使用我们对谓语的了解仅生成有效元组流

由于我们正在使用任意函数,因此我们无法真正执行第二个函数,因此我们选择前一个。 因此,我们首先生成满足条件1 <= a < a + c <= n1 <= b < b + d <= m所有元组。

现在很明显, a[1 .. n]范围内, b[1 .. m] 此外,对于每个a我们可以在[a + 1 .. n - a]具有c ,对于每个b我们可以具有[b + 1 .. m - b] 我们将使用Haskell的列表推导进行编码,这是一种非常时髦的方法

allTuples :: Int -> Int -> [(Int, Int, Int, Int)]
allTuples n m = -- First we take in n, m
  [(a, b, c, d) |
    a <- [1 .. n],
    b <- [1 .. m],
    c <- [a + 1 .. n - a],
    d <- [b + 1 .. m - b]]

这些<-将在这里做正确的事情,并采取所有可能的组合。 接下来,我们需要做的就是使用filter删除元素。

 prune :: Grid -> [(Int, Int, Int, Int)] -> [(Int, Int, Int, Int)]
 prune grid tuples = filter (\t -> f grid t) tuples
 -- could have written:
 -- prune grid = filter (f grid)
 -- prune = filter . f

然后,我们可以将它们粘合在一起,但是我将最后一步留给您,因为我不确定您将如何在应用程序中使用它。 您还可以将以下步骤合并为一个列表理解:

allTuples :: Int -> Int -> [(Int, Int, Int, Int)]
allTuples n m = -- First we take in n, m
  [(a, b, c, d) |
    a <- [1 .. n],
    b <- [1 .. m],
    c <- [a + 1 .. n - a],
    d <- [b + 1 .. m - b],
    f grid (a, b, c, d)]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM