이기종 목록의 모든 요소가 모두 동일한 클래스의 인스턴스 인 경우 함수를 어떻게 적용 할 수 있습니까?

샌드 우드
Prelude> import Data.HList
Prelude Data.HList> let myList = False .*. 'c' .*. HNil
Prelude Data.HList> myList
H[False,'c']
Prelude Data.HList> :t myList
myList :: HList '[Bool, Char]

지금,

Prelude Data.HList> hMap show myList

    <interactive>:5:1: error:
        * Couldn't match type `Bool' with `Char'
            arising from a use of `hMap'
        * In the expression: hMap show myList
          In an equation for `it': it = hMap show myList

H [String, String] 유형의 H [ "False", " 'c'"]가있을 것으로 예상합니다.

나는 show 함수가 Bool 유형과 Char 유형에 대해 실제로 동일한 인스턴스가 아니라는 것을 이해하지만 그러한 작업이 불가능한 경우이 HList의 요점을 얻지 못합니다.

해당 유형이 인스턴스를 공유하는 인스턴스의 함수 부분으로 일반적으로 작동하는 방법은 무엇입니까?

KA Buhr

다른 사람들이 의견에서 말했듯 HList이 사용하기 훨씬 더 쉬울 수있는 대안 이 있습니다.

어쨌든, 나는 당신이 작성해야한다고 생각합니다.

hMap HShow myList

HList 패키지가 작동하는 방식은 HLists 에 대한 모든 작업 이 유형 클래스 수준으로 올라가고 고차 함수 는 "일반"작업자 함수와 같이 작동 hMap하거나 hFoldr작동하지 않지만 유형 클래스 수준으로도 올라 가야합니다.

여기서는 HShow프록시 데이터 유형과 ApplyAB클래스 의 인스턴스를 사용하여 정의됩니다 .

data HShow = HShow
instance (String ~ string, Show a) => ApplyAB HShow a string where
    applyAB _ x = show x

자신 만의 기능이있는 경우 :

add5 :: (Num a) => a -> a
add5 = (+5)

유사한 데이터 유형과 인스턴스를 정의해야합니다.

data HAdd5 = HAdd5
instance (Num a, a ~ b) => ApplyAB HAdd5 a b where
  applyAB _ x = add5 x

그리고:

> let myList = (10.1 :: Double) .*. (6 :: Int) .*. HNil
> print $ hMap HAdd5 myList
H[15.1,11]

이러한 인스턴스를 작성하는 것은 약간 까다로울 수 있습니다. 위의 사례가 더 자연스러운 형식으로 작성된 경우 :

instance (Num a) => ApplyAB HAdd5 a a where
  applyAB _ x = add5 x

그러면 유형 추론이 잘 작동하지 않습니다.

거기에 대한 문서를 많이 될 것 같지 않습니다 HList, 그리고 공식 종이 는 아주 좋은 일반적인 사용 자습서를 만들 것처럼 보이지 않는다. 어쩌면 이 블로그 게시물이 도움이 될 것입니다?

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관