2017-11-16 1 views
3

私はHaskellを初めて使っています私は、関数を入力するときに何時間も費やしてきました。Haskell:List Comprehensionを使ってxを1つずつリストを減らしてxを減らす

makeList 5 == [[1],[1,2],[1,2,3],[1,2,3,4],[1,2,3,4,5]] 
makeList 2 == [[1],[1,2]] 

研究のノー量は本当に私は私が選択した数に基づいて、複数のリストの建物を持っているように、私は私の関数「X」を反復処理する方法を見つけ出すことができます、私は近いんだけど私はどこなのです私の現在のコードは基本的に私がmakeList 3に入ったら私がこれを行うことができる場所に設定されています3:

[[1],[1,2],[1,2,3]] 
+0

左側に '[1..y]'を入れてください。 – Bergi

+1

'makeList = tail。 inits。 enumFromTo 1' – 4castle

+0

'[x | x < - xs] 'は' xs'と同じですので、あなたの関数は 'makeList x = [[1..x-2]、[1..x-1]、[1..x] ] '。 – molbdnilo

答えて

9
Prelude> makeList n = [ [1..x] | x <- [1..n] ] 
Prelude> makeList 5 
[[1],[1,2],[1,2,3],[1,2,3,4],[1,2,3,4,5]] 
+0

ありがとう!それは反復することができるような面白い方法ですが、それは私が把握しようとしていたものでした! – Jace

+0

@Jace:それが意味することはかなり言及していることに注意してください:1からnまでの各 'x 'の結果リスト(' [...] ')を' n' [1..n]] ')ここで各要素は1から' x'( '[[1..x] | x < - [1..n]')までのリストです。あなたがハスケルを学んでいるなら、かなり良い戦略は、自然言語(例えば、英語)のソリューションをコードに変換するのが簡単な方法でフレーズしようとすることです。その後、ソリューションを検討し、それがいかにして免除されるか言い換えるかを見てください。例えば、リスト内包を避けたいのであれば、 'makeList = map upto。最大upto n = [1..n] ' –

2

それとも、明示的な再帰を使用することができます:を出力します。

makeList :: Int -> [[Int]] 
makeList cap = go 1 where 
    go num | num < cap = [1..num]:go (num+1) 
     | otherwise = [1..num]:[] 
関連する問題