2016-10-12 20 views
0

私はuntilを使ってn個の数値([1 ... n])のリストを作成する関数を実行しようとしていました。これまでのところ、私はリストを操作するまでのいずれかの例を発見していないと私は即興してきた:(予期しないトークン)エラーHaskell - リスト上での使用

sequence Int -> [Int] 
sequence x = until (== x) (++ [ +1 ]) [1] 

をしかし、表現の構文エラーを取得しておく私は単純に使用することができます知っていますa [1..n]を使ってリストを作成しますが、私は本当にこの問題を解決したいと思います。助けを前にありがとう。 untilの種類の

+2

問題が1)あなたは 'sequence'と' Int - > Int'の間に '::'が必要です、2)あなたが書いた '+ 1'は何も意味しません、そして3)' until 「この方法は効率的ではないでしょう。あなたはそれを持って国を運ぶ必要があります。 –

+0

なぜこれまでuntilを使いたいのですか?それはタスクの良い候補には見えません。それまでの使用方法を学ぶことは目標そのものですか? – chi

+0

yeah pretty much – StarCharm

答えて

3

をメモ:お使いの場合のために

until :: (a -> Bool) -> (a -> a) -> a -> a 

a[Int]なので、すべてが入力として、リストを取り、リストを返すことがあります。その最後の要素がxに等しい場合

sequence x = until (\y -> last y == x) (\y -> y ++ [last y + 1]) [1] 
  • 述語リストとチェックを取ります。
  • 修飾子はリストを取得し、最後に新しい要素を追加します。その新しい要素はリストの最後の要素より1つ大きい値です。

これは、リストの間違った部分で継続的に作業しているため、あまり効率的ではありません。リストを後方に構築し、最後にそれを逆にすることで、より効率的にすることができます。 (我々は非空のリストを使用していることが保証されているので、私は簡単にするためにパターンマッチングの代わりにheadを使用しています。)

sequence x = reverse $ until ((== x) . head) (\y -> (head y + 1) : y) [1] 

またはxから1までリストを作成:

sequence x = until ((==1) . head) (\y -> head y-1 : y) [x] 
+0

2番目のバージョンは「少し」効率的です。最初のバージョンよりも漸進的に高速です。 – user2407038

+0

私はそれを書いたとき、私はすでにシーケンスx = seq 1と比較していたと思います。ここでは、y == xの場合はseq y = y、それ以外の場合はelse seq(y + 1)です。 – chepner

関連する問題