2011-02-17 5 views
3

HList 패키지를 보았지만 필자가 필요로하는 것은 과도하다고 생각합니다.Haskell에서 이기종 재귀 값을 반복하는 방법

나는이 있습니다

data a :*: b = a :*: b deriving (Show, Eq) 

을하고 나는이 성공적으로 그것을 붙일 수 있습니다

prepend :: a -> b -> a :*: b 
prepend a b = a :*: b 

하지만 난 어떻게 든 "목록"을 반복 할 수 있도록하고 싶습니다 및 수행 요소가있는 것은 있지만 확실하지는 않습니다.

+1

주의,'*''GHC.Generics' – alternative

답변

4

참고 :

ghci> let hetlist = (1 :: Int) :*: ("two" :: String) :*: (3.0 :: Double) :*:() 
ghci> hetlist 
((1 :*: "two") :*: 3.0) :*:() 
ghci> hetlist == hetlist 
True 

당신이 당신의 자신의 typeclasses 사용하여 모방 할 수

class DoStuff a where 
    dostuff :: a -> a 

instance DoStuff Int where dostuff i = 2*i 
instance DoStuff String where dostuff s = s ++ s 
instance DoStuff Double where dostuff d = d/2 
instance DoStuff()  where dostuff() =() 

instance (DoStuff a, DoStuff b) => DoStuff (a :*: b) where 
    dostuff (a :*: b) = dostuff a :*: dostuff b 

을 그리고 컬렉션의 반복이 자동으로

ghci> dostuff hetlist 
((2 :*: "twotwo") :*: 1.5) :*:() 

다른 방법으로는 ExistentialQuantification과 래퍼 유형이 인 경우 자신의 목록 유형을 정의 할 필요가 없습니다.

data DoStuffWrapper = forall a. (DoStuff a) => DoStuffWrapper a 
homlist = [ DoStuffWrapper (1 :: Int) 
      , DoStuffWrapper ("two" :: String) 
      , DoStuffWrapper (3.0 :: Double) 
      ] 
homlist' = map (\(DoStuffWrapper a) -> DoStuffWrapper (dostuff a)) homlist 
+0

.oO (하스켈의 시스템이 너무 발전하여 함수를 퍼스트 클래스가 아니게 만들 수 있습니다.) 예. 표현에 문제가 있습니다! – barsoap

5

HList papergrapefruit-records paper은 여기에서 사용할 수 있습니다.

기본 반복은 비교적 간단합니다 (요소가 Prolog 인 경우 편안하게 생각할 수 있습니다), 요소 유형 (또는 레이블)별로 레코드를 일치 시키면 털이 많아집니다. 유형 평등에 따라 무언가를 수행하는 경우 현재 OverlappingInstances이 필요하고 (대부분의? 모든?) 다형성 유형에 대한 평등을 결정할 수 없습니다.

유형에 따라 일치하는 것이 무엇인가에 따라 "요소로 무엇인가 할 필요가있는 것"일 수 있습니다. 삭제는 쉽다. 인수가 요소 유형과 일치해야하는 함수를 적용하는 것은 간단하지 않지만 요소의 숫자 인덱스를 제공 할 수 있다면 컴파일러 확장없이 수행 할 수 있어야한다.

(편집 : 이것은 당신이 당신의 명부에 최고 수준의 기능을 적용 할 것으로 가정 Rampion의 대답은 쉽게 바닐라 typeclasses를 사용하여 유형에 일치하는 방법을 보여줍니다,하지만 typeclasses는 값으로 건네 줄 수 없습니다..)

결국, 결국 HList 또는 자몽 기록이 지나치게 과장되지는 않을 수도 있습니다. 이미 두 가지 방법으로 목록을 반복 할 수

+2

회지지 @의 barsoap의 조언에 (UN) 표준 타입은 지금이다. 정말 확장 성이 필요하다면, HList보다 단순해질 수 있습니다. HList 논문 (또는 확실히 초안)은 생략하는 것보다 유형 수준 목록에 Nil을 갖는 것이 더 쉽다고 설명합니다. 문제의 * : 정의는 쌍일 뿐이므로 Nil이 없습니다. –