2013-03-04 1 views
2

나는 Monad Transformers Step by Step을 읽습니다.하스켈 : | 수업 내역

class (Monad m) => MonadError e m | m -> e where 
    throwError :: e -> m a 
    catchError :: m a -> (e -> m a) -> m a 

class (Monad m) => MonadReader r m | m -> r where 
    ask :: m r 
    local :: (r -> r) -> m a -> m a 

| m -> e 부분은 무엇을 의미 하는가 : Monad의 일부 서브 클래스를 도입하면서 6 페이지에서, 작가는 다음 코드 예제를 제공합니다?

답변

4

이것은 기능 의존성입니다. GHC에서 사용할 수있는 확장 프로그램입니다. 그 (것)들에 관하여 더 많은 것을 읽을 수있다 here 그러나 그들이 전달하는 기본적인 생각은 유형의 한개가 다른 유형을 "결정한다"이다. 최근에는 유형 가족이 동일한 정보를 전달할 수 있기 때문에 호의적이지는 않지만 더 이해하기 쉽고 기능적인 방식으로 정보를 전달할 수 있습니다.

편집 : 예 : a question I asked about this topic a year ago.

class Shuffle a b | a -> b where 
    indices :: a -> Array Int b 
    reorganize :: a -> Array Int b -> a 

@ehird이 솔루션으로 대응 :

나는 함수 종속 사용하여이 코드를 시작했다

class Shuffle a where 
    type Elt a 
    indices :: a -> Array Int (Elt a) 
    reorganize :: a -> Array Int (Elt a) -> a 

이 그래서 일어난 것은 본질적를 'A -> B'화살표가있는 'a determined b'가 'a'가 유형 변수이고 'b'유형이 유형 클래스 내에 나열된 유형 패밀리로 변경됩니다.

+0

똑같이 선언적이지만 더 기능적인 방식일까요? –

+0

아마 나는 더 명백하게 의미합니다. –

+0

유형 계열을 사용하여 기능 종속성 개념을 어떻게 표현할 수 있는지 예를 들려 줄 수 있습니까? 또한, 후손을 위해, 다음은 [Haskell wiki page on type families] (http://www.haskell.org/haskellwiki/GHC/Type_families)에 대한 링크입니다. –