2017-11-16 1 views
3

저는 하스켈을 처음 사용했습니다. 나는 함수를 입력하는 간단한 함수를 만들려고 많은 시간을 보냈습니다.하스켈 : 목록 이해력을 사용하고 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 :

[[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 : 'n'을 쓰면 각 x에 대해 결과 목록 ('[...]')을 1에서'n' ('[... | x <- [1..n]]') 각 요소는 1에서'x'까지의 목록입니다 ('[[1..x] | x <- [1..n]'). 하스켈을 배우는 경우 꽤 좋은 전략은 코드로 쉽게 변환 할 수있는 방식으로 자연 언어 (예 : 영어)로 솔루션을 시도한 다음 솔루션을 검토하고 이것이 어떻게 desugared 또는 rephrased 될 수 있는지보십시오. 예를 들어,리스트 내포를 피하고 싶다면,'makeList = map upto. 최대 개까지 개까지 [= 1..n]'개까지 –

2

또는 당신은 명시 적으로 재귀를 사용할 수 있습니다 14,는 출력합니다.

makeList :: Int -> [[Int]] 
makeList cap = go 1 where 
    go num | num < cap = [1..num]:go (num+1) 
     | otherwise = [1..num]:[] 
관련 문제