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


19

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

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

로 쓸 수 있습니다

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

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


1
맞습니다 — pure f <*> x와 정확히 동일합니다 fmap f x. pure에 포함 된 이유 가 있다고 확신 Applicative하지만 그 이유를 완전히 모르겠습니다.
bradrn

4
나는 대답 할 시간이없고, 어쨌든 이것이 좋거나 완전한 것을 만들 것이라고 확신하지는 않지만, 하나의 관찰 : pure하나는 Applicative 계산에서 "순수한"값을 사용할 수있게한다. 올바르게 관찰하면와 pure f <*> x동일하지만 f <$> x에 해당하는 내용은 없습니다 f <*> x <*> pure y <*> z. (적어도 나는 그렇게 생각하지 않습니다.)
Robin Zigmond

3
또,보다 이론적 정당화 -가 다른 제제 중요한 밀접하여 관련 Monoid되는 - 클래스 pure에 대응하는 Monoid아이덴티티 원소들 '. (이 제안 Applicative하지 않고 pure있기 때문에, 재미있을 수 Semigroup인 - Monoid반드시 신분을하지 않고 -. 아직 사용 사실, 지금은, 내가 PureScript는 "없이 실용적 정확히 같은있다 기억하는 것 그것에 대해 생각 pure, 클래스"비록 내가 돈 그것이 무엇을 위해 사용되는지 모른다.)
Robin Zigmond

2
@RobinZigmond fmap (\f' x' z' -> f' x' y z') f <*> x <*> z라고 생각합니다. 아이디어는 Applicative"교환"의 법칙으로 문서에 있습니다.
HTNW

3
@RobinZigmond semigroupoid 에서 존재 Applicative하지 pure않습니다 . Apply
듀플로드

답변:


8

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

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입니다.


6
바로 그거죠. Applicative없는 pure경우, 단일체 대신에 반음계 펑터 가있을 수있다 .
왼쪽

20

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하지만 대신 입력 및 기타 반창고에 대한 이상한 제한으로 해결해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.