2013-04-14 1 views
4
이런 식으로 뭔가 내가하고 싶은 것입니다

튜플의 한면에 갈 선택할 때 :중복 인스턴스

data MyDataType = MyDataType 

class HasSpecialField a where 
    specialField :: a -> ByteString 

instance HasSpecialField a => HasSpecialField (a, b) where 
    specialField (a, b) = specialField a 

instance HasSpecialField b => HasSpecialField (a, b) where 
    specialField (a, b) = specialField b 

instance HasSpecialField MyDataType where 
    specialField _ = "Coolio" 

이 같은 튜플이있는 경우입니다 :

myTuple :: (String, (Int, MyDataType)) 

당신은 수를 specialField myTuple을 실행하여 "Coolio"를 반환하십시오.

어쨌든 이것을 할 수 있습니까?

+1

: 그것은 불가능하지만 (예 : 깨끗한 방법으로 그것을 가능하게 할 제안이 있었다 : [인스턴스 체인 (http://web.cecs.pdx.edu/~jgmorris /)). 안타깝게도 현재 인스턴스 체인을 GHC에 추가하려는 작업은 없습니다. –

답변

1

Data이 함수를 사용하여 성공할 수있는 유형으로 만 제한하고 런타임을 조건으로 연기합니다. 한마디로

{-# LANGUAGE DeriveDataTypeable #-} 
import Control.Applicative 

import Data.Generics 

data MyDataType = MyDataType deriving (Typeable, Data) 

specialField :: Data a => a -> Maybe String 
specialField = fmap (\ MyDataType -> "Coolio") . something gfindtype 
관련 문제