2015-11-01 44 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'。 –