때문에 당신이 목록의 마지막 요소를 결합하는 패턴 매칭을 사용할 수 있는지, 궁금하네요?패턴 일치를 사용하여 목록의 마지막 요소를 바인딩 할 수 있습니까? 패턴 매칭을 통해 목록의 머리와 꼬리를 결합 할 수있는 방법이
답변
예, 확장자는 ViewPatterns
입니다. 목록이 비어 어디 아마 경우에 패턴을 추가 할 수 있습니다 있도록이 패턴은 항상 다른 last
이 예외가 발생합니다,하지만 성공할 것
Prelude> :set -XViewPatterns
Prelude> let f (last -> x) = x*2
Prelude> f [1, 2, 3]
6
참고.
Prelude> f []
*** Exception: Prelude.last: empty list
또한 구문 당도입니다. 당신은 여전히 싱글 링크드리스트의 마지막 요소를 액세스하는 때문에 정상적인 패턴 매칭과는 달리,이, O (n)이입니다. 보다 효율적인 액세스가 필요한 경우 Data.Sequence
과 같은 다른 데이터 구조를 사용하십시오. O (1) 양쪽에 액세스 할 수 있습니다.
당신은리스트의 끝 부분에 패턴 매칭을 할 ViewPatterns
을 사용하므로 항상 성공 때문에, 이제
{-# LANGUAGE ViewPatterns #-}
을하고 viewFunction으로 reverse
를 사용하도록 할 수 있습니다 예를 들어
printLast :: Show a => IO()
printLast (reverse -> (x:_)) = print x
printLast _ = putStrLn "Sorry, there wasn't a last element to print."
그래서
모든 가능성을 다루는 한 예외를 throw하지 않는다는 점에서 이것은 안전합니다.
mainFunction (viewFunction -> pattern) = resultExpression
그렇게
mainFunction x = case viewFunction x of pattern -> resultExpression
에 대한 문법 설탕입니다
구문 (당신은. 예를 들어, Maybe
을 반환를 재 작성 수) 당신은 그것을 단지 실제로 볼 수 있습니다 목록을 뒤집은 다음 그 패턴과 일치하지만 더 좋다고 느낍니다. viewFunction
은 사용자가 좋아하는 기능입니다. (확장의 목적 중 하나는 그것에 기능을 정의 할 때 데이터 형식의 기본 구조를 사용하지 않은, 그래서 사람들이 깨끗하게 쉽게 패턴 매칭 기능 을 접근 사용할 수 있도록했다.)
다른 답변은 ViewPatterns
기반 솔루션을 설명합니다.
tailLast :: [a] -> Maybe ([a], a)
tailLast [email protected](_:_) = Just (init xs, last xs)
tailLast _ = Nothing
pattern Split x1 xs xn = x1 : (tailLast -> Just (xs, xn))
를 다음 예와 같은 함수를 작성 : 당신은 그것을 일치와 같은 더 많은 패턴을 확인하려면, 당신은 PatternSynonym
에 그 패키지 할 수 있습니다
foo :: [a] -> (a, [a], a)
foo (Split head mid last) = (head, mid, last)
foo _ = error "foo: empty list"
이 하스켈 프로그램의 첫날이며, 또한 동일한 문제가 발생하지만 이전 솔루션에 제안 외부 유물의 어떤 종류를 사용하여 확인할 수 없습니다.
하스켈에 대한 제 느낌은 핵심 언어에 문제에 대한 해결책이 없다면 해결 방법은 언어에서 작동 할 때까지 문제를 변환하는 것입니다.
이 경우 문제를 변형하는 것은 꼬리 문제를 머리 문제로 변형시키는 것을 의미합니다. 이는 패턴 일치에서 유일하게 지원되는 작업으로 보입니다. 목록 반전을 사용하여 쉽게 수행 할 수 있으며 원래 목록에서 꼬리 요소를 사용하는 것처럼 머리 요소를 사용하여 역순 목록에서 작업하고 마지막으로 결과를 초기 순서로 되돌릴 수 있습니다 (예 : if 그것은 목록이었다).
예를 들어 정수 목록 (예 : [1,2,3,4,5,6])이 주어지면 끝에서 시작하여 원래 목록의 모든 두 번째 요소가있는이 목록을 작성한다고 가정합니다 그것의 두 배로 옮겨진다 (Homework1의 this excellent introduction to Haskell에서 가지고가는 운동) : [2,2,6,4,10,6]. 그것은 더 이상 이전의 솔루션보다 분명히입니다
revert :: [Integer] -> [Integer]
revert [] = []
revert (x:[]) = [x]
revert (x:xs) = (revert xs) ++ [x]
doubleSecond :: [Integer] -> [Integer]
doubleSecond [] = []
doubleSecond (x:[]) = [x]
doubleSecond (x:y:xs) = (x:2*y : (doubleSecond xs))
doubleBeforeLast :: [Integer] -> [Integer]
doubleBeforeLast l = (revert (doubleSecond (revert l)))
main = putStrLn (show (doubleBeforeLast [1,2,3,4,5,6,7,8,9]))
, 그러나 그것은 나에게 더 하스켈 틱 느낌 :
그런 다음 우리는 다음을 사용할 수 있습니다.StackOverflow에 오신 것을 환영합니다. 축하해주세요! 상대방을 액세스하기 위해 목록을 반대로 바꾸는 것은 정말로 매우 하스 켈리시 (Haskellish) 솔루션입니다. (오히려 비효율적이긴하지만, 'last'를 사용하면 여러 번 해봐야 할 때 더욱 악화 될 수 있습니다 ... 성능이 중요하고 액세스해야하는 경우 마지막 요소이면 목록이 적절한 유형이 아님). – leftaroundabout
감사합니다. 나의 신참 선수 수준에서, 나는 성능에 미치는 영향을 관찰하기보다 하스켈 프로그래밍 관용구를 발견하는 데 더 많은 관심이 있습니다. 간단히 말해서 역순으로 연결된리스트를 사용하는 것이 더 나쁜 경우이며, 실제로 하스켈이 테일 패턴 매칭을 제공하지 않는 이유라고 생각합니다. (하스켈 목록은 단순히 단순 연결 목록을 사용하여 구현됩니다.) – OlivierD
맞음. 하스켈리스트는 스택이나 무한한 스트림처럼 훌륭하지만 무작위 액세스에는 정말 좋지 않으며 상대편에 액세스하는 것은 중간에있는 요소에 액세스하는 것보다 낫습니다. – leftaroundabout
- 1. 한 번에 목록의 여러 요소를 일치하는 Ocaml 패턴
- 2. 불완전한 패턴 일치를 필터로 사용 하시겠습니까?
- 3. C : 이중 링크 목록의 머리와 꼬리를 외부 함수와 연결할 수 없습니다. [주소 지정 문제]
- 4. 중첩 된 목록의 요소를 결합 - 파이썬 3
- 5. CSS를 사용하여 목록의 마지막 항목을 선택하는 방법이 있습니까?
- 6. 목록의 일부를 어떻게 정렬 할 수 있습니까?
- 7. WPF - 목록의 요소를 반복하십시오.
- 8. 목록의 마지막 요소 제거 (체계)
- 9. 여러 요소를 "링크"할 수있는 방법이 있습니까?
- 10. Perl에서 여러 패턴 일치를 확인하는 방법
- 11. 하스켈에서 목록의 요소를 이동하는 방법?
- 12. 패턴
- 13. 링크 된 목록의 마지막 노드
- 14. SQL로 변환 할 수있는 PHP 사양 패턴
- 15. 구성표 - 목록의 각 요소를 목록 (목록의 목록)으로 바꿉니다
- 16. "불가능한"경우에도 하스켈에서 철저한 패턴 매칭을 항상하는 것이 좋습니까?
- 17. regex를 사용하여 마지막 패턴 만 JS로 바꾸기
- 18. 스칼라 : 두 개의 균등 유형간에 분산 및 패턴 매칭을 입력하십시오.
- 19. 목록의 현재 항목을 다른 목록의 항목에 어떻게 가입시킬 수 있습니까?
- 20. 목록의 마지막 요소를 파이썬에서 다르게 처리하는 방법은 무엇입니까?
- 21. Erlang : receive 절의 레코드를 패턴 일치시키는 방법이 있습니까?
- 22. 목록의 요소를 .csv 파일로 인쇄
- 23. WPF에서 데이터 바인딩 할 때 "사용할 수없는"값의 패턴
- 24. 패턴
- 25. WinForms 데이터 바인딩 - 목록의 개체에 바인딩
- 26. flex 속성을 플래시 속성에 바인딩 할 수있는 방법이 있습니까?
- 27. 목록의 배경 이미지에서 jQuery 클릭 이벤트를 트리거 할 수 있습니까?
- 28. jQuery : 같은 클래스의 여러 요소를 어떻게 바인딩 할 수 있습니까?
- 29. 패턴 매칭을 위해 매개 변수화 된 정규 표현
- 30. MOSS의 AssetUrlSelector는 목록의 하위 폴더를 탐색 할 수 있습니까?
마지막으로 빈 목록에서 예외가 발생합니다. 내가 마지막으로, 머리, fst, snd에서 벗어나고 싶습니다. 빈 목록을 잘 처리하지 않는 함수. 예를 들어, 패턴 일치 (let x : xs) = "abcdefg"는 내가 내 질문에서 언급 한 것입니다. 안전하지 않은 prelude 함수를 사용하지 않고 마지막 요소를 얻는 비슷한 접근법이 있기를 바랬습니다. –
@MichaelLitchard : 음, 예를 들어'Maybe '를 반환하는'safeLast' 함수를 정의 할 수 있습니다.이 함수는 패턴 일치를 적용하거나 목록을 역순으로 변환 한 다음 정상적인 패턴 일치를 사용할 수 있습니다. – hammar
항상 성공하기 때문에 "패턴 일치"가 전혀 없습니다. 'f = (* 2). 마지막 '이 더 좋다. – u0b34a0f6ae