Haskell의 화살표 이해
나는 화살표가 대부분의 FRP 구현 의 기초이기 때문에 화살표를 잡으려고 노력해 왔습니다 . 나는 기본 아이디어를 이해한다고 생각합니다. 모나드와 관련이 있지만 각 바인드 연산자에 정적 정보를 저장하므로 전체 화살표를 평가할 필요없이 화살표 체인을 살펴보고 정적 정보를 볼 수 있습니다.
그러나 나는 우리가 첫 번째, 두 번째 및 스왑에 대해 논의하기 시작하는 시점에서 길을 잃었습니다. 2- 튜플은 화살표와 어떤 관련이 있습니까? 튜토리얼은 분명한 다음 단계 인 것처럼 튜플 내용을 제시하지만 실제로 연결이 보이지는 않습니다.
그 점에서 화살표 구문은 직관적으로 무엇을 의미합니까?
에서 살펴 보시기 바랍니다 http://www.cs.yale.edu/homes/hudak/CS429F04/AFPLectureNotes.pdf FRP의 방법 화살표 작업을 설명합니다.
2 개의 인수를 사용하는 화살표 함수를 나타 내기 위해 화살표를 정의하는 데 2- 튜플이 사용됩니다.
FRP에서 상수와 변수는 종종 "입력"을 무시하는 화살표로 표시됩니다.
twelve, eleven :: Arrow f => f p Int
twelve = arr (const 12)
eleven = arr (const 11)
그런 다음 함수 응용 프로그램이 구성 ( >>>
) 으로 바뀝니다 .
# (6-) 12
arr (6-) <<< twelve
이제 2- 인수 함수를 화살표로 어떻게 바꾸나요? 예를 들어
(+) :: Num a => a -> a -> a
카레 때문에 우리는 이것을 함수를 반환하는 함수로 취급 할 수 있습니다. 그래서
arr (+) :: (Arrow f, Num a) => f a (a -> a)
이제 상수에 적용 해 봅시다
arr (+) -- # f a (a -> a)
<<< twelve -- # f b Int
:: f b (Int -> Int)
+----------+ +-----+ +--------------+
| const 12 |----> | (+) | == | const (+ 12) |
+----------+ +-----+ +--------------+
잠깐만, 작동하지 않습니다. 결과는 여전히 함수를 반환하는 화살표이지만 f Int Int
. 구성 만 허용되기 때문에 Arrow에서는 카레가 실패합니다. 그러므로 우리는 먼저 함수 를 풀어야 합니다
uncurry :: (a -> b -> c) -> ((a, b) -> c)
uncurry (+) :: Num a => (a, a) -> a
그런 다음 우리는 화살표가
(arr.uncurry) (+) :: (Num a, Arrow f) => f (a, a) a
이 때문에 2- 튜플이 발생합니다. 그런 다음 &&&
이러한 2- 튜플을 처리하기 위해 다음과 같은 묶음 함수 가 필요합니다.
(&&&) :: f a b -> f a d -> f a (b, d)
그러면 추가가 올바르게 수행 될 수 있습니다.
(arr.uncurry) (+) -- # f (a, a) a
<<< twelve -- # f b Int
&&& eleven -- # f b Int
:: f b a
+--------+
|const 12|-----.
+--------+ | +-----+ +----------+
&&&====> | (+) | == | const 23 |
+--------+ | +-----+ +----------+
|const 11|-----'
+--------+
(이제 왜 우리 &&&&
는 3 개의 인수를 갖는 함수에 대해 3- 튜플 과 같은 것이 필요하지 않습니까? ((a,b),c)
대신 a를 사용할 수 있기 때문 입니다.)
편집 : John Hughes의 원본 논문 Generalising Monads to Arrows 에서 이유를 다음과 같이 설명합니다.
4.1 화살표와 쌍
그러나 모나드 사업자의 경우에도 불구
return
하고>>=
모두 우리 화살표를 들어, 유사 연산자를 유용한 코드를 작성 시작할 필요arr
와>>>
충분하지 않다. 앞에서 본 단순한 모나드 덧셈 함수도add :: Monad m => m Int -> m Int -> m Int add x y = x >>= \u -> (y >>= \v -> return (u + v))
cannot yet be expressed in an arrow form. Making dependence on an input explicit, we see that an analogous definition should take the form
add :: Arrow a => a b Int -> a b Int -> a b Int add f g = ...
where we must combine
f
andg
in sequence. The only sequencing operator available is>>>
, butf
andg
do not have the right types to be composed. Indeed, theadd
function needs to save the input of typeb
across the computation off
, so as to be able to supply the same input tog
. Likewise the result off
must be saved across the computation ofg
, so that the two results can eventually be added together and returned. The arrow combinators so far introduced give us no way to save a value across another computation, and so we have no alternative but to introduce another combinator.
ReferenceURL : https://stackoverflow.com/questions/3154701/understanding-arrows-in-haskell
'programing' 카테고리의 다른 글
사용 가능한 iPhone 웹 애플리케이션 JavaScript UI 라이브러리 / 프레임 워크 (0) | 2021.01.16 |
---|---|
SIFT 알고리즘을 사용하여 두 이미지가 얼마나 유사한 지 계산하는 방법은 무엇입니까? (0) | 2021.01.16 |
CSS에 대한 기본 URL 지정 (0) | 2021.01.16 |
내 시스템에 너무 많은 Python 버전이있어 문제를 일으킴 (0) | 2021.01.16 |
암시 적 클래스는 항상 AnyVal을 확장해야합니까? (0) | 2021.01.16 |