【问题标题】:How to solve longEnough?. In Haskell [closed]如何解决 longEough?。在哈斯克尔[关闭]
【发布时间】:2016-02-01 15:15:07
【问题描述】:

longEnough n xs:检查列表是否有超过n 的元素。

例子:

  • longEnough 2 [1..5] == True
  • longEnough 3 [1,2,3] == False
  • longEnough 0 [] == False
  • longEnough 20 [1..] == True

【问题讨论】:

标签: haskell


【解决方案1】:

我想这是家庭作业,你还在学习基础知识,所以我将首先使用递归而不是 foldr 给你一些提示(正如 @dfeuer 建议的那样):

首先要注意一些明显的案例:

  • 如果xs = []那么结果总是False(假设你不关心负的n在某些奇怪的方式)
  • 如果n = 0xs 不为空,则始终为True
  • 在所有其他情况下,您有
    • n > 0
    • xs 有多个元素

也许你有一些递归的想法来分解最后一个案例?

这是一个骨架:

longEnough :: Int -> [a] -> Bool
longEnough _ []     = False
longEnough 0 _      = True
longEnough n (_:xs) = let n' = (n-1) in undefined

对于这些情况 - 如果您仔细观察,您会发现我什至在解决方案上添加了更多提示。


PS

  • 也许你想考虑一下负面的n 以及那些应该发生的事情......我做了不是在这里
  • 如果您知道 foldr 的全部含义,您可能也应该尝试使用 foldr 来实现它

解决方案

似乎没有来自 OP 的更多反馈,所以我想我也可以像开始一样发布解决方案:

longEnough :: Int -> [a] -> Bool
longEnough _ []     = False
longEnough 0 _      = True
longEnough n (_:xs) = longEnough (n-1) xs

(真的没有太多事情要做......)

这里是提到的测试用例:

λ> longEnough 2 [1..5]
True
λ> longEnough 3 [1,2,3]
False
λ> longEnough 0 []
False
λ> longEnough 20 [1..]
True

【讨论】:

  • 我建议在解释中使用= 而不是==,因为这可能应该使用== 来实现。
  • @dfeuer 公平点(确实 没想到会使用 == 来实现,正如您从缺少的约束中看到的那样)
  • 如果这不是家庭作业问题,longEnough n = not . null . drop n
猜你喜欢
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多