2015-11-01 42 views
-5

longEnough n xs:检查列表是否有多个n元素。如何解决longEnough ?.在Haskell中

例子:

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

有何评论? ? – user5511358

+1

请参阅[有任何方法来分离无限列表和有限列表吗?](http://stackoverflow.com/questions/33016410/is-there-any-way-to-separate-infinite-and-finite-lists) – user3237465

+0

使用'foldr'。折叠列表以产生一个采用所需严格的较低长度限制的函数。 – dfeuer

回答

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 
+0

我推荐在说明中使用'='而不是'==',因为这可能不应该使用'=='来实现。 – dfeuer

+1

@dfeuer公平点(事实上,* I *并不期望通过'=='来实现,正如你可以通过缺少的约束所看到的那样) – Carsten

+2

如果这不是一个家庭作业问题,'longEnough n = not。空值 。下降n'。 –