2017-04-18 3 views
0

사람들이 map, fold 또는 bind에 대해 이야기 할 때 대개 들었던 용어를 듣지 만, 기본적으로 모든 고차원 기능이 해제되는 것은 아닙니다. 리프팅 기능과 상위 기능 간의 차이점

filtera -> Bool에서 [a] -> [a]에 리프트가 될 수 없습니다 (모델 if 문 경우)가 a -> a에서 Bool -> a에 리프트를 고려 될 수 도대체 심지어 bool 기능. 그렇지 않은 경우 Applicative type 클래스의 ap이 리프트로 간주되는 이유는 무엇입니까?

중요한 것은 ... f a ...... a ...에서가는 경우, ap이 경우에 맞지 않을 것 중 하나 f (a -> b) -> f a -> f b

답변

2

내가 아무도 이미 대답하지 않았다 놀랐어요.

리프팅 함수의 역할은 함수를 컨텍스트 (일반적으로 Functor 또는 Monad)로 옮기는 것입니다. 따라서 유형 a -> b의 함수를 List 컨텍스트로 들어 올리면 List[a] -> List[b] 유형의 함수가됩니다. 그것에 대해 생각한다면 정확히 이것은 map (또는 하스켈의 fmap)입니다. 사실 그것은 Functor의 정의의 일부입니다.

그러나 Functor는 하나의 인수 만 가져올 수 있습니다. 우리는 또한 다른 요소들의 기능을 다룰 수 있기를 원합니다. 예를 들어 a -> b -> c 유형의 함수가있는 경우 map을 사용할 수 없습니다. 여기서 더 일반적인 리프팅 작업이 그림에 포함됩니다. 하스켈에서 우리는이 경우에 대한 lift2 있습니다

M[a]
lift2:: (a -> b -> c) -> (M[a] -> M[b] -> M[c]) 

이 지정된 유형 a 매개 변수화 어떤 특별한 모나드 (List 같은)입니다.

lift의 변형이 다른 arities에도 정의되어 있습니다.

filter은 필요한 형식 서명에 맞지 않아서 리프팅 기능이 아닙니다. 유형 a -> bool에서 M[a] -> M[bool]으로 기능을 해제하지 않습니다. 그러나 이것은 더 높은 차원의 함수입니다.

하스켈 위키를 들어 올리는 것에 대해 더 읽고 싶다면 good article on it