"@"기호는 Haskell의 목록과 관련하여 무엇을 의미합니까?


127

다음과 같은 하스켈 코드를 보았습니다.

ps@(p:pt)

@이 문맥에서 상징은 무엇을 의미합니까? Google에서 정보를 찾을 수없는 것 같습니다 (불행히도 Google에서 기호를 찾기가 어렵습니다). Prelude 설명서에서 기능을 찾을 수 없으므로 대신 일종의 구문 설탕이어야한다고 생각합니다.


14
특정 기호를 검색하지 마십시오. 일반적으로 Haskell 구문을 검색 한 다음 전체 토론에서 기호를 찾으십시오. 예를 들어, "하스켈 구문"의 최고 구글 결과 : cs.utep.edu/cheon/cs3360/pages/haskell-syntax.html . @해당 페이지에서 두 번째 항목이 설명합니다.
Rob Kennedy

1
URL을 찾은 방법을 정확하게 언급 한 것은 @Iter입니다. 누구나 오늘 과정을 반복하고 그들이 찾은 모든 페이지에서 답을 찾을 수 있습니다.
Rob Kennedy

답변:


179

예, 그것은 단지 @"as"로 큰 소리로 읽히는 구문 설탕 입니다. ps@(p:pt)당신에게 이름을 제공합니다

  1. 목록 : ps
  2. 목록의 머리 : p
  3. 목록의 꼬리 : pt

이 없으면 @(1) 또는 (2) :( 3) 중에서 선택해야합니다.

이 구문은 실제로 모든 생성자에 적용됩니다. 당신이있는 경우 data Tree a = Tree a [Tree a], 다음 t@(Tree _ kids)당신에게 나무와 자식 모두에 액세스 할 수 있습니다.


3
이 구문의 이름을 알고 있습니까?
danza

7
이것은 "패턴으로"라고합니다
adamo

41

@기호가있는 매개 변수에 이름을 부여하고 다음 패턴에 대하여 그 매개 변수와 일치하는 모두에 사용됩니다 @. 목록에만 국한되지 않으며 다른 데이터 구조와 함께 사용할 수도 있습니다.

이 기능은 매개 변수를 함수의 어딘가에 그대로 유지하면서 매개 변수의 일부로 "분해"하려는 경우에 유용합니다. 이러한 경우의 한 가지 예 tails는 표준 라이브러리 의 함수입니다.

tails                   :: [a] -> [[a]]
tails []                =  [[]]
tails xxs@(_:xs)        =  xxs : tails xs

21

@모든 수준에서 작동 하는 것을 추가하고 싶습니다 .

let a @ (b @ (Just c), Just d) = (Just 1, Just 2) in (a, b, c, d)

그러면 다음이 생성됩니다. ((Just 1, Just 2), Just 1, 1, 2)

따라서 기본적으로 패턴을 값에 바인딩하는 방법입니다. 이것은 또한 위에서 설명한 것처럼 목록뿐만 아니라 모든 종류의 패턴으로 작동한다는 것을 의미합니다 . 더 많은 경우에 사용할 수 있기 때문에 이것은 매우 유용한 정보입니다.

이 경우, a전체는 Maybe Tuple, b단지 첫 번째 Just튜플하고, c그리고 d상기 제 및 제 포함 된 값이다 Just각각 튜플


9

다른 사람들이 말한에 추가하려면, 그들 불리는 AS-패턴 (구문 "으로"키워드를 사용 ML에), 그리고에 하스켈 보고서의 절에서 설명하는 패턴 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.