에 튜플? 아니면 나쁜 하스켈 연습입니까?목록의 난과 같은 목록이 있다고 가정 해 봅시다 하스켈
답변
대상 목록의 모든 두 번째 요소를 삭제하고 zip
을 사용하는 도우미 함수를 사용하여이를 수행하는 한 가지 방법이 있습니다. 목록에 이상한 길이가 있어도 아직 질문에 정의되어 있지 않기 때문에 원하는 동작을하지 못할 수 있습니다.
-- This is just from ghci
let my_list = ["Questions", "that", "may", "already", "have", "your", "correct", "answer"]
let dropEvery [] _ = []
let dropEvery list count = (take (count-1) list) ++ dropEvery (drop count list) count
zip (dropEvery my_list 2) $ dropEvery (tail my_list) 2
[("Questions","that"),("may","already"),("have","your"),("correct","answer")
도우미 기능은 같은 생각의 많은 다른 구현, 더 나은 재귀 최적화 특성을 가진 아마 많은있다 99 Questions.에서 질문 # 6에서 가져옵니다.
dropEvery
을 이해하려면 각각 take
과 drop
이 무엇인지 기억하는 것이 좋습니다. take k some_list
은 k
의 항목을 some_list
으로 취합니다. 한편 drop k some_list
은 첫 번째 k
항목을 삭제합니다.
N 번째 요소를 모두 삭제하려면 N-1 개 요소를 계속 실행 한 다음 하나를 삭제하고 완료 될 때까지 동일한 작업을 다시 수행해야 함을 의미합니다.
첫 번째 부분 인 dropEvery
은 다음과 같습니다. take
첫 번째 count-1
항목이 나머지 목록에서 가져온 항목과 연결됩니다.
그 후 drop count
라고 말합니다. (N-1에 대해 잊어 버리고, N 번째 자리에서 1을 버려야합니다.) 그리고 이것들을 버린 후에는 같은 논리를 반복적으로 남은 부분에 적용합니다.
이런 방식으로 사용하면 Haskell에서 상당히 비쌀 수 있습니다. 따라서 성능 측면에서 볼 때 매우 좋지는 않지만 99 개 질문 페이지에서 사용할 수있는 짧은 구현 중 하나였습니다. 여기
좀 더 읽기 어쩌면 하나 샷에 모든 것을 할 수있는 기능입니다 :byTwos :: [a] -> [(a,a)]
byTwos [] = []
byTwos xs = zip firsts seconds
where enumerated = zip xs [1..]
firsts = [fst x | x <- enumerated, odd $ snd x]
seconds = [fst x | x <- enumerated, even $ snd x]
이 경우, 나는이 문제가있는 경우 zip
으로 해결하기 쉬운 것입니다 말로 시작 I 홀수 색인 요소 목록과 짝수 색인 요소 목록이 이미 있습니다. 그럼 그냥 쓰고, where
절에 넣는 것에 대해 걱정하겠습니다.
where
절에서 먼저 zip xs [1..]
을 말하면 [("Questions", 1), ("that", 2), ...]
이됩니다.
사이드 노트 : fst
은 튜플의 첫 번째 요소를 취하고 snd
은 두 번째 요소를 사용합니다.
나서 firsts
번째 요소 홀수 경우 모든 값의 첫 번째 요소를 가지고 말한다 - 이들은 zip
로부터 최종 출력 튜플의 "최초"로서 기능한다.
seconds
같은 일을 말한다 만 경우 두 번째 요소는 짝수 - 이러한 zip
에서 최종 출력 튜플에 "초"로 될 것입니다.
, firsts
한 요소 이상 seconds
보다 더 그래서 최종 zip
목록의 마지막 요소는 단순히 삭제됩니다 것을 의미 할 것이다, 그 결과 당신이 전화 것처럼 동일합니다 목록의 앞부분에있는 기능 (최종 요소를 제외한 모든 요소).
의 요소가 짝수 일 수 있습니다. 그것이 나를 위해 정말로 혼란 스럽기 때문에 –
대단히 감사합니다! –
마지막 기능을 조금 자세히 설명해 주시겠습니까? 나는 당신이 그곳에서하고있는 것을 전적으로 얻었는지 확신하지 못합니다 ... –
당신은
combine :: [a] -> [(a, a)]
combine (x1:x2:xs) = (x1,x2):combine xs
combine (_:_) = error "Odd number of elements"
combine [] = []
을 사용할 수 있습니다 또는 당신은 내가 그렇지 않은 타 대답 같은 일부 복잡한 방법을 사용할 수 있습니다 정말로 이해하고 싶다.
더 일반적인 :
당신이xs
에 의해 이름이 주어진 목록 즉, 목록에있는 모든 두 개의 연속 된 항목을 페어링의 원하는 결과를 얻을 수 있습니다
Data.List.Split
에서
chunk
를 사용
map2 :: (a -> a -> b) -> [a] -> [b]
map2 f (x1:x2:xs) = (f x1 x2) : map2 f xs
map2 _ (_:_) = error "Odd number of elements"
map2 _ [] = []
재미있는 기능. 라이브 데모를 사용하여 –
이것은 매우 간결한 반면, 홀수 길이 목록의 패턴 일치 오류가 나에게 너무 많은 고통을주기 때문에 명시 적으로 패턴 일치 'x : y : xs'를 피하는 것이 나의 목표 중 하나이며, 도우미 함수 그것을 피하는 것은 꽤 쉽습니다. – ely
문제가 표시되지 않습니다. –
,
import Data.List.Split
map (\ys -> (ys!!0, ys!!1)) $ chunk 2 xs
이 솔루션은 주어진 목록에 짝수 개의 항목이 있다고 가정합니다.
f [] = []
f (x:y:xs) = (x,y):f(xs)
그것은 빈리스트가 빈 목록을 제공한다는 것을 의미하고, 두 개 이상의 요소 목록이 두 몇 당신에게 목록을 반환 :
간단한 패턴 매칭 트릭을 할 수 다음 요소와 동일한 추론을 적용하면 ...
- 1. 의가 있다고 가정 해 봅시다
- 2. 알고리즘의 내가 번호 목록이 있다고 가정 해 봅시다 특정 조건
- 3. 의 내가 있다고 가정 해 봅시다 TSQL
- 4. 해제의 우리가 있다고 가정 해 봅시다 SKU
- 5. 이의 내가 있다고 가정 해 봅시다 SuperclassOfTypeA
- 6. IOS는의 내가 있다고 가정 해 봅시다 끝
- 7. 다음의 내가 있다고 가정 해 봅시다 ++
- 8. 는이 전 다음과 같은 데이터베이스 구조 있다고 가정 해 봅시다
- 9. 방법의 나는 다음과 같은 테이블이 있다고 가정 해 봅시다 SQL
- 10. CDI는이 전 다음과 같은 클래스가 있다고 가정 해 봅시다 객체
- 11. 의 나는 다음과 같은 코드가 있다고 가정 해 봅시다 AJAX
- 12. Nginx에 리디렉션의 내가 같은 URL 있다고 가정 해 봅시다 URL
- 13. JPA 쿼리의 나는이 같은 엔티티 있다고 가정 해 봅시다 목록
- 14. 은 이제 나는이 같은 상황 있다고 가정 해 봅시다 방법
- 15. 의 나는 다음과 같은 해시 있다고 가정 해 봅시다 루비
- 16. 정규식의 내가 같은 문자열이 있다고 가정 해 봅시다 특정 태그
- 17. 캐스트는 이제 다음과 같은 I가 있다고 가정 해 봅시다 런타임에만
- 18. 는이 전 다음과 같은 정렬 된 목록이 있다고 가정 해 봅시다 간격
- 19. 의 난과 같이, 투명 PNG 이미지가 있다고 가정 해 봅시다 색상
- 20. 가져 오기 데이터베이스 유형의 내가 schema.rb이 있다고 가정 해 봅시다
- 21. 장고의 내가이 URL을 가지고 있다고 가정 해 봅시다 특정 관리자보기
- 22. 삽입 별개의 값의 난이 두 클래스가 있다고 가정 해 봅시다 #
- 23. 오류 메시지가의 내가 내보기에이 있다고 가정 해 봅시다
- 24. 내가 같이 두 개의 테이블이의가 있다고 가정 해 봅시다 jQuery를
- 25. 의 내가 자바 클래스 있다고 가정 해 봅시다 클래스 속성
- 26. PHP 새로운 라인 : \ n의 내가이 변수 있다고 가정 해 봅시다
- 27. 이의 내가 시트 같이 있다고 가정 해 봅시다 가이드
- 28. 의 내가 클래스 있다고 가정 해 봅시다 재산권
- 29. 는이 전 다음 쿼리를 있다고 가정 해 봅시다 간단한 쿼리
- 30. 의 내가 다음 튜플 있다고 가정 해 봅시다 튜플
홀수 개의 요소가있는 경우 어떻게해야합니까? – ErikR
이 경우 항상 @ user5402 –