나는 이걸로 당황 스럽다. 하스켈의 루프 - 정렬 - 물건 - 어떻게 쓰는지 알아낼 수 없다. 기본적으로 세 가지 기능을 정의했습니다. , 리플 및 셔플입니다.하스켈의 함수에 대한 루핑
riffle [1,2,3] [4,5,6] = [1,4,2,5,3,6]
을 그리고 셔플의 분할의 양 riffling을 반복하는 것입니다
split :: [a] -> ([a],[a])
split xs = splitAt (length xs `div` 2) xs
riffle :: [a] -> [a] -> [a]
riffle xs [] = xs
riffle [] ys = ys
riffle (x:xs) (y:ys) = x:y:riffle xs ys
shuffle :: Int -> [a] -> [a]
shuffle 0 xs = xs
shuffle n xs = shuffle (n-1) (riffle a b)
where (a, b) = split xs
은 기본적으로 절반의 목록을 분할 예를 들어, 그래서 리플이 두 목록 '인터레이스'로 가정된다 분할 목록 항목. 이제는 함수를 정의해야합니다. 을 반복하여 원래 목록을 다시 가져 오는 데 걸리는 셔플 반복 횟수를 출력합니다.
난 그냥 당신이 셔플을 통해 루프를 수행 할 수있는 방법으로 붙어있어repeats :: [Int] -> Int
... 나는 그것이 지능형리스트와 함께 할 수있는 뭔가가 생각하지만 난 아무것도 얻을 수 없습니다 : 함수는 같은 정의 . 아직 람다 표현식을 시험해 보았지만 필자는 그것이 필요하다고 생각하지 않는다. 그건 그렇고, 셔플은 항목 수가 짝수 인 목록에서 수행해야합니다. 어떤 아이디어?
@hammar가 설명하는대로'tail $ iterate'로 목록을 생성하고 ['elemIndex'] (http://hackage.haskell.org/packages/archive/base/latest/doc/html/)를 사용할 수도 있습니다. Data-List.html # v : elemIndex)를 사용하여 재발 색인을 찾습니다. – dflemstr