자바에서 함수 인스턴스를 구현하여 Applicative
및 Monad
에 대한 이해를 높이려고합니다. 하스켈에 대한 나의 지식은 제한적이며 내 질문이 전혀 의미가 없기를 바랍니다. 여기함수 인스턴스의 bind/>> =를 해석하는 방법은 무엇입니까?
자바 스크립트에 Functor
, Applicative
및 Monad
typeclasses에 대한 fmap
, <*>
및 >>=
의 내 구현은 다음과 같습니다
const fmap = f => g => x => f(g(x)); // B combinator
const apply = f => g => x => f(x) (g(x)); // S combinator
const bind = f => g => x => g(f(x)) (x); // ?
내가 bind
가 하스켈 구현의 정확한 번역인지 확실하지 않다
(>>=) :: (r -> a) -> (a -> (r -> b)) -> r -> b
instance Monad ((->) r) where
f >>= k = \ r -> k (f r) r
을 제공한다면 bind
이 정확한지를 어떻게 해석합니까? Applicative
은 효과적인 계산을 순서대로 처리 할 수 있음을 알고 있습니다. 또한 Monad
은 이전 결과의 결과에 따라 다음 효과를 결정할 수 있음을 알고 있습니다.
apply
:나는 시퀀스 (자바 스크립트의 열망 평가 순서) 볼 수 있습니다
f(x)
...g(result of f)
:f(x)
...g(x)
...lambda(result of g)
...을lambda
bind
의 결과 ...lambda(x)
... 그러나lambda
의 결과는 bind
재미 ction은 꽤 이상하게 보입니다. f
과 g
이 다른 방법으로 중첩 된 이유는 무엇입니까? 이 구현에 반영된 특정 Monad
동작 (이전 효과에 따라 다음 효과를 결정)은 어떻게됩니까? 사실 g(f(x)) (x)
은 반전 된 인수가있는 함수 구성과 같습니다. 여기서 g
은 이진 함수입니다.
단항 및 이진 함수로 apply
/bind
을 적용하면 동일한 결과가 나타납니다. 이것은별로 의미가 없습니다.
'bind' (JS에서'chain'으로 알려짐)의 유용한 응용 프로그램에 대해서는 [this example] (http://stackoverflow.com/q/40026018/1048572)을보십시오 – Bergi