[haskell] 응용 분야에서 순수한 필요성

Haskell ‘s Applicatives를 배우고 있습니다. 그것은 것을 (나는 아마 틀렸다) 날 것으로 보인다 pure예를 들어, 기능이 정말 필요하지 않습니다 :

pure (+) <*> [1,2,3] <*> [3,4,5]

로 쓸 수 있습니다

(+) <$> [1,2,3] <*> [3,4,5]

누군가가 pure함수가 명시 적 매핑보다 제공 하는 이점을 설명 할 수 있습니까 fmap?



답변

나는 여기서 역량의 가장자리에있다. 그래서 이것을 그 이상으로 가져 가지 마라. 그러나 그것은 설명하기에는 너무 길었다.

pure타입 클래스 에 포함시켜야 할 실질적인 이유가있을 수 있지만, 많은 Haskell 추상화는 이론적 기초에서 비롯된 Applicative것입니다. 문서에서 알 수 있듯이 강력한 lax monoidal functor입니다 (세부 사항은 https://cstheory.stackexchange.com/q/12412/56098 참조 ). 난 그 가정 pure은 AS 역할 정체성 처럼, return위해하는 Monad(A 인 endofunctors의 범주에서 모노 이드 ).

고려 pure하고 liftA2:

pure :: a -> f a
liftA2 :: (a -> b -> c) -> f a -> f b -> f c

조금 곁눈질을한다면 liftA2, 이진 연산 이라고 상상할 수있을 것이다 .

이진 함수를 동작으로 들어 올리십시오.

pure그러면 해당 ID입니다.


답변

fmap항상 자르지는 않습니다. 특히, pure당신이 소개 할 것입니다 f(곳 f입니다 Applicative당신은 이미이없는 경우). 좋은 예는

sequence :: Applicative f => [f a] -> f [a]

값을 생성하는 “작업”목록을 가져 와서 값 목록을 생성하는 작업으로 바꿉니다. 목록에 조치가 없으면 어떻게됩니까? 제정신의 유일한 결과는 가치를 창출하지 않는 행동입니다.

sequence [] = pure [] -- no way to express this with an fmap
-- for completeness
sequence ((:) x xs) = (:) <$> x <*> sequence xs

이없는 경우 pure비어 있지 않은 작업 목록을 요구해야합니다. 확실히 작동시킬 수는 있지만 0을 언급하지 않고 덧셈에 대해 이야기하거나 1이없는 곱셈에 대해 이야기하는 것과 같습니다 (다른 사람들이 말했듯이 Applicatives는 단일체 이기 때문에 ). 쉽게 해결할 수있는 엣지 케이스가 반복적으로 발생 pure하지만 대신 입력 및 기타 반창고에 대한 이상한 제한으로 해결해야합니다.


답변