Haskell에서 바인드 연산자와 Kleisli 연산자의 차이점은 무엇이며 어떻게 관련되어 있습니까?


대답 1:

나는 그것을 가정하고있다 :

  • '바인드 연산자'는 모나드 바인드입니다. >> = 'Kleisli 연산자'는 Kleisli 화살표 (일명 '물고기')의 구성입니다 :> =>

먼저 Kleisli 화살표는 다음과 같은 형태의 함수입니다.

a-> mb

일부 모나드 m. 이 함수의 두 개의 화살표를 작성하여 일반적인 함수 구성과 같이 세 번째 화살표를 만들 수 있습니다 (인수 순서 제외). Kleisli 화살표 구성 연산자 (일명 '물고기')는 다음과 같습니다.

(> =>) :: (a-> mb)-첫 번째 Kleisli 화살표-> (b-> mc)-두 번째 Kleisli 화살표-> (a-> mc)

return과 join으로 모나드를 정의하면 다음과 같이 쓸 수 있습니다.

(f> => g) x = 조인 (g <$> fx)

때문에

(g <$> fx) :: 엠 (MC)

여기서 <$>는 fmap의 접두사 변형입니다. 무점 표기법 :

f> => g = 조인 fmap g. 에프

return은 순수한 값을 감싸고 join은 한 수준의 중첩 (m (ma)-> ma)을 제거한다는 것을 기억하십시오.

바인드 연산자는 Kleisli 화살표를 모나드 값에 적용합니다.

(>> =) :: ma-monadic 값-> (a-> mb)-Kleisli 화살표-> mb

리턴 및 결합 측면에서 정의 할 수도 있습니다.

mx >> = f = 조인 (f <$> mx)

마찬가지로

(f <$> mx) :: m (MB)

사실, 우리는 '물고기'와 그 반대로 바인드를 정의 할 수 있습니다.

mx >> = f = (const mx> => f) () (f> => g) x = fx >> = g