Haskell의 <|> 연산자는 무엇을합니까?
Haskell의 문서를 살펴 보는 것은 항상 저에게 약간의 고통입니다. 왜냐하면 함수에 대해 얻는 모든 정보는 종종 단순한 것 이상이 아니기 때문입니다. f a -> f [a]이것은 여러 가지를 의미 할 수 있습니다.
<|>기능 의 경우와 같습니다.
내가받은 것은 이것 (<|>) :: f a -> f a -> f a뿐이다. 그것은 "연관 이진 연산"이라는 것이다 .
검사를 Control.Applicative통해 구현에 따라 겉보기에 관련없는 일을한다는 것을 알게됩니다.
instance Alternative Maybe where
empty = Nothing
Nothing <|> r = r
l <|> _ = l
좋습니다. 왼쪽이 없으면 오른쪽으로, 그렇지 않으면 왼쪽으로 돌아갑니다.이 연산자는 "왼쪽 또는 오른쪽"연산자라고 믿게 만듭니다.이 연산자는 |and |의 역사적 용도를 "OR "
instance Alternative [] where
empty = []
(<|>) = (++)
여기를 제외하고는 목록의 연결 연산자를 호출합니다.
그렇다면 그 기능은 정확히 무엇입니까? 그 용도는 무엇입니까? 사물의 웅장한 계획에서 어디에 적합합니까?
일반적으로이 점에서 "선택"또는 "병렬"를 의미 a <|> b중 하나의 "선택"입니다 a또는 b또는 a및 b병렬로 수행. 그러나 백업합시다.
정말, 같은 typeclasses의 운영에 실질적인 의미가 없다 (<*>)거나 (<|>). 이러한 작업은 (1) 법칙을 통해 그리고 (2) 인스턴스화를 통해 두 가지 방식으로 의미가 부여됩니다. 특정 사례에 대해 이야기하고 있지 않다면 Alternative(1) 만 직관적 인 의미로 사용할 수 있습니다.
"연관"수단 그래서 a <|> (b <|> c)와 동일합니다 (a <|> b) <|> c. 이는 "트리 구조"가 아니라 와 함께 연결된 일련 의 사물 에만 관심이 있음을 의미하므로 유용합니다 (<|>).
다른 법률에는 empty. 특히 a <|> empty = empty <|> a = a. "선택"또는 "병렬"을 가진 우리의 직관에서 이러한 법칙은 "a 또는 (무언가 불가능한)이어야합니다"또는 "함께 (빈 과정)은 단지 a"로 읽 힙니다. .NET empty에 대한 일종의 "실패 모드" 임을 나타냅니다 Alternative.
(from ) 또는 / (from ) 과 어떻게 (<|>)/ empty상호 작용 하는지에 대한 다른 법칙이 있지만,의 의미를 이해하는 가장 좋은 방법 은 인스턴스화하는 유형의 매우 일반적인 예를 조사하는 것 입니다 : a .fmapFunctorpure(<*>)Applicative(<|>)AlternativeParser
만약 x :: Parser A및 y :: Parser B다음 (,) <$> x <*> y :: Parser (A, B)파싱 x 다음 y 순서입니다. 반대로,로 시작하는 또는을 (fmap Left x) <|> (fmap Right y)구문 분석 하여 가능한 두 구문 분석을 모두 시도합니다. 즉, 구문 분석 트리 의 분기 , 선택 항목 또는 병렬 구문 분석 유니버스를 나타냅니다.xyx
(<|>) :: f a -> f a -> f a에 대한 법칙을 고려하지 않고도 실제로 많은 것을 알려줍니다 Alternative.
두 가지 f a값을 취하고 하나를 돌려 주어야합니다. 따라서 어떻게 든 입력을 결합하거나 선택해야합니다. 그것은 유형에서 다형성 a이므로, 어떤 유형의 값 a이 내부에있을 수 있는지 완전히 검사 할 수 없습니다 f a. 이것은 값 을 결합하여 "결합"을 수행 할 수 없음을 의미 a하므로 유형 생성자가 f추가 하는 구조의 관점에서 순전히해야 합니다.
이름도 약간 도움이됩니다. 어떤 종류의 "OR"은 실제로 저자가 "Alternative"라는 이름과 "<|>"기호로 나타내려는 모호한 개념입니다.
이제 두 개의 Maybe a값이 있고이를 결합해야한다면 어떻게해야합니까? 그들은 둘 경우 Nothing나는 것 가지고 돌아 Nothing을 만들 수있는 방법으로, a. 그들 중 적어도 하나가 인 경우 Just ...입력 중 하나를 그대로 반환하거나 Nothing. type으로 도 가능한 함수는 거의 없으며 Maybe a -> Maybe a -> Maybe a이름이 "Alternative"인 클래스의 경우 주어진 함수 는 상당히 합리적이고 분명합니다.
두 [a]값을 결합하는 것은 어떻 습니까? 여기에 더 많은 가능한 기능이 있지만 실제로 이것이 무엇을 할 수 있는지는 매우 분명합니다. 그리고 "Alternative"라는 이름 은 목록 모나드 / 응용 적의 표준 "비결 정성"해석에 익숙 하다면 이것이 무엇에 관한 것인지에 대한 좋은 힌트를 제공 합니다. 를 가능한 값의 모음이 [a]있는 "비 결정적 a" 으로 보는 경우 a"대안"이라는 이름에 걸 맞는 방식으로 " 두 개의 비 결정적 값을 결합"하는 명백한 방법은 값 중 하나 일 수있는 비결정론을 생성하는 a것입니다. 입력 중 하나에서.
그리고 파서의 경우; 두 개의 파서를 결합하면 두 가지 명백한 광범위한 해석이 떠 오릅니다. 어느 쪽이든 당신은 두 번째는 무엇을 다음 첫 번째가 무엇 일치 할 파서를 생성하거나 파서을 생산하는 경기 중 무엇을 먼저 수행 하거나 (이 옵션이 휴가의 각 물론 미묘한 세부 사항이 무엇인지, 두 번째는 않습니다 옵션을위한 공간). "Alternative"라는 이름이 주어지면 "or"해석은에 대해 매우 자연스러워 보입니다 <|>.
따라서 충분히 높은 수준의 추상화에서 보면 이러한 작업 은 모두 "동일한 작업을 수행 "합니다. 유형 클래스는 실제로 이러한 모든 것이 "동일 해 보이는"높은 수준의 추상화에서 작동하기위한 것입니다. 알려진 단일 인스턴스에서 <|>작업 할 때 작업이 특정 유형에 대해 정확히 수행되는 작업 이라고 생각 합니다.
Alternative파서 나 MonadPlus와 같은 것이 아닌 의 흥미로운 예 Concurrently는 async패키지 에서 매우 유용한 유형입니다 .
를 들어 Concurrently, empty영원히 계속 계산이다. 그리고 (<|>)인수를 동시에 실행하고 완료 한 첫 번째 인수의 결과를 반환하고 다른 인수를 취소합니다.
이들은 보인다 매우 다른,하지만 고려 :
Nothing <|> Nothing == Nothing
[] <|> [] == []
Just a <|> Nothing == Just a
[a] <|> [] == [a]
Nothing <|> Just b == Just b
[] <|> [b] == [b]
So... these are actually very, very similar, even if the implementation looks different. The only real difference is here:
Just a <|> Just b == Just a
[a] <|> [b] == [a, b]
A Maybe can only hold one value (or zero, but not any other amount). But hey, if they were both identical, why would you need two different types? The whole point of them being different is, you know, to be different.
In summary, the implementation may look totally different, but these are actually quite similar.
참고URL : https://stackoverflow.com/questions/26002415/what-does-haskells-operator-do
'Program Club' 카테고리의 다른 글
| Windows에서 cd / d % ~ dp0 명령은 무엇을 의미합니까? (0) | 2020.11.20 |
|---|---|
| Git 상태 무시 줄 끝 / 동일한 파일 / Windows 및 Linux 환경 / Dropbox / mled (0) | 2020.11.20 |
| 한 쪽이 다른 쪽을 가리켜도 / bin / sh가 / bin / bash와 다르게 동작하는 이유는 무엇입니까? (0) | 2020.11.20 |
| SyncRoot 패턴의 용도는 무엇입니까? (0) | 2020.11.20 |
| SQL에서 max (count (*))를 할 수 있습니까? (0) | 2020.11.20 |