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이없는 곱셈에 대해 이야기하는 것과 같습니다 (다른 사람들이 말했듯이 Applicative
s는 단일체 이기 때문에 ). 쉽게 해결할 수있는 엣지 케이스가 반복적으로 발생 pure
하지만 대신 입력 및 기타 반창고에 대한 이상한 제한으로 해결해야합니다.