기능이 모나드 일 수있는 방법을 이해하는 데 어려움이 있습니다. 미란 Lipovača says이 나를 혼란하게 대해모나드 인스턴스로서의 기능
instance Monad ((->) r) where
return x = \_ -> x
h >>= f = \w -> f (h w) w
심지어 어떤 :
기능 (->) r
이 Control.Monad.Instances
의 선언에 따라 모나드 인, >>=
의 구현이 조금 애매 보인다
하지만, 실제로는 이 아닙니다. 함수에 모나드 값을 공급하기 위해
>>=
을 사용하면 결과는 항상 모나드 값입니다. 따라서이 경우 다른 함수에 함수를 공급하면 결과도 함수입니다. 결과는 람다로 시작하는 이유는 입니다.>>=
의 구현은 항상 모나드 값에서 결과를 분리 한 다음 해당 결과에 함수 f를 적용했습니다. 똑같은 일이 여기 발생합니다. 함수에서 결과를 얻으려면 함수에 적용해야합니다. 따라서 함수를 사용하여 함수의 결과를 얻은 다음 f를 적용합니다. f는 모나드 값을 반환하는데, 이 우리 함수의 함수이므로, 우리는 이것을 w에 적용한다. -> (A -> MB) -> 메가그래서
h
과 같이 입력했는지 걸릴 (>> =) :: 엄마 :
의 유형 서명은 (>> =)이있다 m a
및 f
은 (a -> m b)
이다. 함수가 m a
인 경우 a
값을 반환합니까? 또는 a
유형을 가지고있는 다른 것을 반환합니까? h
의 비 모나드 값이 f
에 공급되는 경우
은, 우리가 얻을 : F (시간 w) 잘 보인다. f
은 하나의 함수이고 유일한 인수를 사용 했으므로 이미 값입니다. 모나드 함수이기 때문에이 값은 모나드 값이기도합니다. 그렇다면 왜 다른 값 w
이 필요합니까? w
~ f something
을 모나드가 아닌 것으로 만들지 않습니까? 즉, 더 이상 기능이 아닌 것입니까? 아니요. 또한 f something
과 h
이 같은 인수 인 w
을 사용하고 다른 값 유형 (m a
및 m b
)을 반환하는 이유를 이해할 수 없습니다.
감사합니다. 모든 것이 분명하다! – amemus