2017-02-21 6 views
4

나는 내가 정의한 다른 데이터 유형을 가지고 있으며, 그것들을 모두 클래스의 인스턴스로 만들고 싶습니다. 각각 개별적으로 선언 할 필요없이 유형 목록 및 인스턴스를 매핑 할 수 있습니까?내가 haskell에서 유형의 목록을 만들 수 있습니까?

나는 이런 식으로 뭔가 의미 : 실제로 당신이 할 수있는

data Type1 = ... 
data Type2 = ... 

map (instance ClassName) [Type1, Type2] 
+1

다른 모든 매개 변수를 사용하여 이러한 모든 유형을 'F x y ...'형식으로 다시 작성할 수없는 한, 유일한 옵션은 Template Haskell을 통해 인스턴스를 생성하는 것입니다. 그다지 편리하지 않으므로 글을 쓸 인스턴스가 많은 경우에만 양초의 가치가 있습니다. – chi

+0

'map (instance ClassName)'은 정확히 무엇을할까요? 'map'은리스트를 취하고 각 아이템에 똑같은 일을합니다. 모든 인스턴스가 동일합니까? 그렇다면 형식도 동일해야합니다. 왜 다른 형식을 사용해야합니까? 아니면'ClassName'이 빈 클래스입니까? 그럼 그게 뭡니까? –

+0

json 변환을 수행하기 위해 aeson을 사용하고 있습니다. generic을 사용하여 from 및 json의 인스턴스로 자동 선언 된 유형을 사용할 수 있으므로 json 데이터를 나타내는 다른 유형을 생성 할 수 있습니다. 이 경우 클래스의 인스턴스를 유형으로 만들고 추가 정의가 필요하지 않으며 여러 JSON 데이터를 나타내는 데 필요한 여러 유형이 있으므로 각 유형에 인스턴스를 매핑하는 것이 좋습니다. –

답변

10

음, 뭔가

{-# LANGUAGE TemplateHaskell #-} 

module T where 

class C a 

data X = X 
data Y = Y 
data Z = Z 

$(fmap concat $ mapM (\t -> [d|instance C $t|]) [[t|X|], [t|Y|], [t|Z|]]) 

등이 있지만 실제로는 자동으로 생성 할 필요가없는 것이 나에게로 대규모 과잉 파업 (예 : , 유형 목록은 무언가에 따라 다를 수 있음).