【问题标题】:How can I pass a list of unknown length to a haskell function?如何将未知长度的列表传递给haskell函数?
【发布时间】:2022-10-09 22:07:27
【问题描述】:
secondTest :: [(Int, Int)] -> [Int] -> [Int]
secondTest a b = [ x | (m,n) <- a, x <- b,  m > 3 && n > 3]

我现在有这段代码,我想更改它,以便如果给定的所有 int 都超过 3,无论第一个列表中给出多少个 int,它都会返回 b。

我尝试过这样的事情:

secondTest :: [Int] -> [Int] -> [Int]
secondTest a b = [ x | m <- a, x <- b,  m > 3]

但这会返回一个值,如果任何的 int 值大于 3,而不是全部。

编辑以显示预期回报:

secondTest [4,4] [1,2] = [1,2]
secondTest [4,4,4] [1,2] = [1,2]
secondTest [4,1,4] [1,2,9] = Nothing

谢谢

【问题讨论】:

  • 当并非所有值都 > 3 时,您需要返回什么?也许您应该提供一些显示预期结果的示例。例如。 f [4,4] [1,2] = ?f [4,4,4] [1,2] = ?f [4,1,4] [1,2,9] = ?
  • @chi 嘿!我已经对其进行了编辑以包含此内容,希望这对您有所帮助

标签: list function haskell list-comprehension


【解决方案1】:

您可以使用all 测试a 的所有元素是否大于3:

secondTest :: [Int] -> [Int] -> [Int]
secondTest a b
   | all (> 3) a = b 
   | otherwise   = ...

请注意,在otherwise 的情况下,我们仍然需要返回一个列表,因此我们不能返回Nothing。我们可以返回一个空列表

secondTest a b
   | all (> 3) a = b 
   | otherwise   = []

或者我们可以改变函数的返回类型

secondTest :: [Int] -> [Int] -> Maybe [Int]
secondTest a b
   | all (> 3) a = Just b 
   | otherwise   = Nothing

您不能通过列表理解直接执行此操作。充其量,您可以使用一个来生成&lt;= 3 的元素列表,然后测试它是否为空,颠倒逻辑:

secondTest a b
   | null [ x | x <- a, x <= 3 ] = Nothing
   | otherwise                   = Just b

【讨论】:

  • 谢谢!如果 list a 是一个应用于单个 int 的布尔函数列表,这将如何改变? IE。第一项是一个函数,如果 int 大于 3,则返回 true,第二项是一个函数,如果 int 为偶数,则返回 true。然后,如果所有这些函数都返回 true,它将返回 b。例如,像这样:thirdTest :: [listOfFunctions] -&gt; [Int] -&gt; [Int] thirdTest a b | all (listOfFunctions) b = b | otherwise = [] 它会将 listOfFunctions 中的函数应用于 Int 列表中的每个项目,然后返回满足所有函数的那些?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多