[haskell] “@”기호는 Haskell의 목록과 관련하여 무엇을 의미합니까?

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

ps@(p:pt)

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



답변

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

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

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

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


답변

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

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

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


답변

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

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각각 튜플


답변

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


답변