2012-11-21 33 views
0

我需要做一個函數「權力」,它需要一個數字n,並返回該數字的無限列表,以每個數字的權力例如,使用Haskell的子集的權力的無限列表

powers 2 = 2,4,8,16,32...... 

我需要做在我的唯一可用的內置函數是語言的這種使用非常特定子集:DIV,MOD,偶,奇,頭,尾,沒有,空,長,反轉,ELEM, map,filter,foldr,sum,product,take,drop,takewhile,dropWhile,zipWith和from。

該子集也沒有^運算符。

有一些進一步的重要的制約:

  • 代碼必須不超過1線的超過80個字符
  • 沒有「輔助函數」允許的,即我不能再寫功能這個定義中使用。

到目前爲止,我的思路是沿着這些線路:

powers = \n -> map (\x -> "some function to get n to the power of x") (from 1) 

但我無法弄清楚如何獲得的功能做到這一點沒有一個輔助功能。

例如,如果我要使用返回數字x的無限列表的函數inflist,那麼我可以執行以下操作。

powers = \n -> map (\x -> product(take x (inflist n))) (from 1) 

但我不能做這個或任何類似的東西,因爲我不能使用該功能。

對不起,如果符號是不同於正常的哈斯克爾,它是一個非常嚴格的核心haskell子集使用這種符號。

+0

允許哪些運營商到底是什麼?如果你不能使用'*',而且必須創建一個長度正確的「2」列表放入'product'中,問題會變得更加困難(但更有趣!)。如果你不能使用list consing操作符':'和空列表,或''''''=='/'<='運算符來檢查長度,那麼這又會非常棘手...... – yatima2975

回答

3

這是一個遞歸問題。

powers n = n : map (* n) (powers n) 

(你被允許使用:?)

+0

是的,我可以使用「:」但(* n)不會在這個版本的haskell中工作,我需要定義一個函數來完成它將要做的工作。 – Jacxel

+0

這可能不是一項艱鉅的任務......但haskell即時學習版本沒有(* n)或等價物...所以說實話我不完全確定它的意思是做什麼 – Jacxel

+0

你可以說'(\ m - > m * n)'代替'(* n)'? (後者被定義爲前者。) – dave4420