하스켈에서 어떻게 튜플을이 클래스의 인스턴스로 만들 수 있습니까?

NrBanMex

나는 " 하스켈을 배울 때 내가 알았 으면하는 것 "이라는 책을 읽고 있었고이 예제를 중단했습니다.

class Bifunctor p where
    bimap  :: (a -> b) -> (c -> d) -> p a c -> p b d
    first  :: (a -> b) -> p a c -> p b c
    second :: (b -> c) -> p a b -> p a c

내 질문은 : 어떻게 그 클래스의 인스턴스를 만들 수 있습니까? 아이디어는 함수를 다음과 같이 호출하는 것입니다.

λ bimap  (+1) (+2) (8, 9) -- (9, 11)
λ first  (*4) (10, 8) -- (40, 8)
λ second (*2) (3, 5) -- (3, 10)

이것을 달성하기 위해 가장 가까운 것은 다음과 같습니다.

instance Bifunctor (x, y) where
    bimap func func' (x, y) = (func x, func' y)
    first func (x, y) = (func x, y)
    second func (x, y) = (x, func y)

하지만 작동하지 않고 오류가 발생합니다.

• Expecting two fewer arguments to ‘(x, y)’
  Expected kind ‘* -> * -> *’, but ‘(x, y)’ has kind ‘*’
• In the first argument of ‘Bifunctor’, namely ‘(x, y)’
  In the instance declaration for ‘Bifunctor (x, y)’
폴 R

좋은 질문.

클래스는 펑터 유형 자체에 적용되며 귀하의 경우 펑터 유형은 (,)입니다. 그것에 대한 느낌을 얻으려면 여기에서 차이점을 확인하십시오.

:t (,)
(,) :: a -> b -> (a, b)

:t (True,False)
(True,False) :: (Bool, Bool)

다음과 같은 쌍 유형을 사용했다면 더 직관적이었을 것입니다.

data Pair a b = Pair a b

클래스 정의를 읽으면 'p'의 유형 적용이 더 분명해 졌기 때문입니다.

Haskell이 위에서 설명한 것처럼 값에 유형을 사용하는 것처럼 Kinds 라는 유형의 유형 (컴파일 시간 논리에도 해당)을 사용 합니다.

:k Pair
Pair :: * -> * -> *

:k (,)
(,) :: * -> * -> *

:k (Bool,Bool)
(Bool,Bool) :: *

:k Bifunctor 
Bifunctor :: (* -> * -> *) -> Constraint

이 마지막 줄은 Bifunctor 클래스가 (a, b) (* -> * -> *)종류 (*)아닌 종류 유형을 위해 설계 되었으므로 GHC에서받은 오류 메시지를 보여줍니다.

귀하의 정의는 거의 맞았습니다. 여기에 올바른 정의가 있습니다.

instance Bifunctor (,) where
  bimap func func' (x, y) = (func x, func' y)
  first func (x, y) = (func x, y)
  second func (x, y) = (x, func y)

편집 : @leftroundabout에서 제안한 종류의 그림

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

클래스 인스턴스로 만들 수있는 인스턴스 이름 목록을 어떻게 만들 수 있습니까?

분류에서Dev

typescript에서 클래스의 인스턴스가 아닌 클래스를받는 인터페이스를 어떻게 만들 수 있습니까?

분류에서Dev

파이썬에서 클래스의 인스턴스를 포함하는 객체를 어떻게 만들 수 있습니까?

분류에서Dev

QGraphicsRectItem 및 QGraphicsEllipseItem을 한 클래스에서 어떻게 하위 클래스로 만들 수 있습니까?

분류에서Dev

어떻게 Spring 애플리케이션을 단일 스레드로 만들거나 하나의 인스턴스를 갖도록 만들 수 있습니까?

분류에서Dev

튜플 시퀀스를 어떻게 만들 수 있습니까?

분류에서Dev

클래스에서 만들어진 인스턴스 수를 어떻게 알 수 있습니까?

분류에서Dev

튜플 유형 동의어를 Read 인스턴스로 쉽게 만들 수 있습니까?

분류에서Dev

이 TypeScript 인터페이스의 함수 인스턴스를 어떻게 만들 수 있습니까?

분류에서Dev

함수에서 스칼라의 튜플 목록을 어떻게 만들 수 있습니까?

분류에서Dev

단어 목록에서 하스켈 파서를 어떻게 만들 수 있습니까?

분류에서Dev

인터페이스 인스턴스 메서드가 동일한 클래스의 인수 만 받아들이도록하려면 어떻게해야합니까?

분류에서Dev

클래스 이름에 변수 이름이있는 클래스를 어떻게 만들 수 있습니까?

분류에서Dev

어떻게 하스켈에서이 함수를 호출 할 수 있습니까?

분류에서Dev

다른 2 개의 모델 클래스로 List <ViewModel>을 어떻게 만들 수 있습니까? MVC ASP.NET

분류에서Dev

하스켈에서 파일을 어떻게 읽을 수 있습니까?

분류에서Dev

matplotlib의 Figure 클래스를 어떻게 하위 클래스로 만들 수 있습니까?

분류에서Dev

자바 스크립트만으로 활성 클래스의 색인을 어떻게 얻을 수 있습니까?

분류에서Dev

실제 클래스의 정의를 어떻게 만들 수 있습니까?

분류에서Dev

KClass <MutableList <Foo <* >>>의 인스턴스를 어떻게 만들 수 있습니까?

분류에서Dev

Koin은 게시 된 라이브러리에서 클래스의 인스턴스를 만들 수 없습니다.

분류에서Dev

Haskell의 길이에서 스팬을 어떻게 만들 수 있습니까?

분류에서Dev

가상 클래스의 벡터를 어떻게 만들 수 있습니까?

분류에서Dev

한 클래스에서 다른 클래스로 액세스 할 수있는 부울을 어떻게 만들 수 있습니까?

분류에서Dev

matplotlib mark_inset 디스플레이 라인을 그래프 위에 어떻게 만들 수 있습니까?

분류에서Dev

어떻게하면 부모 클래스에서 객체를 만들 수 있지만 Perl의 자식 클래스로 축복 할 수 있습니까?

분류에서Dev

클래스의 각 인스턴스에 대한 필드 값 배열을 어떻게 얻을 수 있습니까?

분류에서Dev

스왑 파일을 어떻게 만들 수 있습니까?

분류에서Dev

C ++에서 ProgID 만 주어진 클래스를 어떻게 인스턴스화 할 수 있습니까?

Related 관련 기사

  1. 1

    클래스 인스턴스로 만들 수있는 인스턴스 이름 목록을 어떻게 만들 수 있습니까?

  2. 2

    typescript에서 클래스의 인스턴스가 아닌 클래스를받는 인터페이스를 어떻게 만들 수 있습니까?

  3. 3

    파이썬에서 클래스의 인스턴스를 포함하는 객체를 어떻게 만들 수 있습니까?

  4. 4

    QGraphicsRectItem 및 QGraphicsEllipseItem을 한 클래스에서 어떻게 하위 클래스로 만들 수 있습니까?

  5. 5

    어떻게 Spring 애플리케이션을 단일 스레드로 만들거나 하나의 인스턴스를 갖도록 만들 수 있습니까?

  6. 6

    튜플 시퀀스를 어떻게 만들 수 있습니까?

  7. 7

    클래스에서 만들어진 인스턴스 수를 어떻게 알 수 있습니까?

  8. 8

    튜플 유형 동의어를 Read 인스턴스로 쉽게 만들 수 있습니까?

  9. 9

    이 TypeScript 인터페이스의 함수 인스턴스를 어떻게 만들 수 있습니까?

  10. 10

    함수에서 스칼라의 튜플 목록을 어떻게 만들 수 있습니까?

  11. 11

    단어 목록에서 하스켈 파서를 어떻게 만들 수 있습니까?

  12. 12

    인터페이스 인스턴스 메서드가 동일한 클래스의 인수 만 받아들이도록하려면 어떻게해야합니까?

  13. 13

    클래스 이름에 변수 이름이있는 클래스를 어떻게 만들 수 있습니까?

  14. 14

    어떻게 하스켈에서이 함수를 호출 할 수 있습니까?

  15. 15

    다른 2 개의 모델 클래스로 List <ViewModel>을 어떻게 만들 수 있습니까? MVC ASP.NET

  16. 16

    하스켈에서 파일을 어떻게 읽을 수 있습니까?

  17. 17

    matplotlib의 Figure 클래스를 어떻게 하위 클래스로 만들 수 있습니까?

  18. 18

    자바 스크립트만으로 활성 클래스의 색인을 어떻게 얻을 수 있습니까?

  19. 19

    실제 클래스의 정의를 어떻게 만들 수 있습니까?

  20. 20

    KClass <MutableList <Foo <* >>>의 인스턴스를 어떻게 만들 수 있습니까?

  21. 21

    Koin은 게시 된 라이브러리에서 클래스의 인스턴스를 만들 수 없습니다.

  22. 22

    Haskell의 길이에서 스팬을 어떻게 만들 수 있습니까?

  23. 23

    가상 클래스의 벡터를 어떻게 만들 수 있습니까?

  24. 24

    한 클래스에서 다른 클래스로 액세스 할 수있는 부울을 어떻게 만들 수 있습니까?

  25. 25

    matplotlib mark_inset 디스플레이 라인을 그래프 위에 어떻게 만들 수 있습니까?

  26. 26

    어떻게하면 부모 클래스에서 객체를 만들 수 있지만 Perl의 자식 클래스로 축복 할 수 있습니까?

  27. 27

    클래스의 각 인스턴스에 대한 필드 값 배열을 어떻게 얻을 수 있습니까?

  28. 28

    스왑 파일을 어떻게 만들 수 있습니까?

  29. 29

    C ++에서 ProgID 만 주어진 클래스를 어떻게 인스턴스화 할 수 있습니까?

뜨겁다태그

보관