2016-10-05 1 views
1

나는 하스켈에서 초보자이며, 이것을하려고한다. exercise.파서를 Functor로 바꿀 필요가있다.

그래서 Applicative Parser를 구현하려면 Functor Parser를 구현해야합니다.

하지만 "첫 번째 함수 힌트"를 사용하여 Functor를 구현하는 방법에 대해 고민하고 있습니다. (사실, 실제로 "fmap f Parser a"를 사용하여 달성하려는 작업을 파악할 수 없습니다. ?

누군가가 그것을 설명 할 수

+2

파서 유형의 정의와 인스턴스를 직접 정의 할 때 시도한 시도를 보여주십시오. 하지만 어느 쪽이든 먼저 펑터에 대해 조금 읽어야합니다 ... 정말로, 이것들은 그리 어렵지 않습니다. 만약 당신이 그들과 무엇을해야 할지를 알지 못한다면, 당신은' Applicative 인스턴스. [LYAH] (http://learnyouahaskell.com/functors-applicative-functors-and- monoids)는 항상 쉬운 출발입니다. – leftaroundabout

+0

필자는 (예를 들어 lyahfgg와 같은) functor에 관한 내용을 이미 읽었으며, IO Monad, Maybe Monad와 같은 쉬운 (?) 펑터에 대한 fmap의 사용법을 이해할 수 있습니다. 그러나 여기에서는'String -> Maybe (a, String)'형식의 함수에 함수를 매핑해야하는데,이 경우에는 필자가 이것을 할 필요가 있다는 것을 이해할 수 없습니다 (Applicative). –

+0

파서의 펑쳐 인스턴스는 일부 파생 함수를 파서의 최종 결과에 적용하는 데 사용되며, 본질적으로 파서 a를 파서 b로 변경합니다. – shang

답변

2

을 우리는 평소처럼

fmap :: (a -> b) -> Parser a -> Parser b 

을 정의해야합니다, 우리는 패턴 매칭에 의해 시작 :

fmap f (Parser p) = _ 
fmap f (Parser p) = Parser _ 

이제 우리는, 구멍에 String -> Maybe (b, String)을하는 기능이 필요합니다 : 0

결과는 파서, 그래서의 생성자를 적용 할 수한다. 그럼 하나 만들자 :

fmap f (Parser p) = Parser $ \s -> _ 

나는 이것을 끝내려고한다.

+0

나는 당신이'String -> Maybe (b, String)'를 의미한다고 생각한다. – amalloy

+0

다음은 나의 구현이다. 그러나 나는 functor로부터 기대해야할 것을 모른다. 필자는 OK라면 안된다 : 인스턴스 Functor 파서 fmap g (파서 f) = 파서 f ' f = case fs Nothing - > Nothing 그냥 (x, ss) -> Just (gx, ss) ' –

+0

@MaximeB., 맞습니다. Hackage에 대한 클래스의 문서를 읽으면'Functor'에서 기대할 수있는 것을 볼 수 있습니다. – dfeuer

관련 문제