Haskell 如何解决足够长的时间?。在哈斯克尔

Haskell 如何解决足够长的时间?。在哈斯克尔,haskell,Haskell,足够长的n xs:检查列表中的元素是否超过n 示例: 足够长2[1..5]==True 足够长的3[1,2,3]==False 足够长的0[]==False 足够长20[1..]==True 我猜这是家庭作业,您仍在学习基础知识,因此我将首先使用递归而不是foldr(如@dfeuer建议的那样)给您一些提示: 首先,注意一些明显的情况: 如果xs=[],则结果总是False(假设您不以某些奇怪的方式关心负值n) 如果n=0和xs为非空,则它始终为True 在所有其他情况下,你有 n>0 x

足够长的n xs
:检查列表中的元素是否超过
n

示例:

  • 足够长2[1..5]==True
  • 足够长的3[1,2,3]==False
  • 足够长的0[]==False
  • 足够长20[1..]==True

我猜这是家庭作业,您仍在学习基础知识,因此我将首先使用递归而不是
foldr
(如@dfeuer建议的那样)给您一些提示:

首先,注意一些明显的情况:

  • 如果
    xs=[]
    ,则结果总是
    False
    (假设您不以某些奇怪的方式关心负值
    n
  • 如果
    n=0
    xs
    为非空,则它始终为
    True
  • 在所有其他情况下,你有
    • n>0
    • xs
      有多个元素
也许你有一些递归的想法来分解最后一个案例

这是一个骨架:

longEnough :: Int -> [a] -> Bool
longEnough _ []     = False
longEnough 0 _      = True
longEnough n (_:xs) = let n' = (n-1) in undefined
对于这些情况,如果仔细观察,您会发现我甚至在解决方案上添加了更多提示


附言
  • 也许你想考虑一下消极的
    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

请参见使用
foldr
。折叠列表以生成一个具有所需严格下限长度的函数。您尝试了什么?所以这不是一个解决家庭作业的服务。在这类问题上,海报通常会显示一些努力。我建议在解释中使用
=
,而不是
=
,因为这可能不应该使用
=
@dfeuer fair point来实现(事实上,我并不希望使用
=
来实现,正如您可以从缺少的约束中看到的那样)如果这不是一个家庭作业问题,
longtough n=not。无效的删除n