programing

Haskell의 화살표 이해

projobs 2021. 1. 16. 09:13
반응형

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 and g in sequence. The only sequencing operator available is >>>, but f and g do not have the right types to be composed. Indeed, the add function needs to save the input of type b across the computation of f, so as to be able to supply the same input to g. Likewise the result of f must be saved across the computation of g, 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

반응형