홈>
모든
TypeRep
의 목록을 얻는 방법이 있습니까
일반 프로그래밍을 사용하여 가치 안에 있습니까?
예를 들어, 함수를 정의 할 수 있을까요 :
typeReps :: (Data a, Typeable a) => a -> [TypeRep]
그런 식으로 :
>>> typeReps (1 :: Int, 'a')
[(Int, Char), Int, Char]
>>> typeReps (Foo ['a', 'b'])
[Foo, [Char], Char, Char]
내가 시도했다
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE RankNTypes #-}
module Example where
import Data.Data
import Data.Typeable
typeReps :: (Data a, Typeable a) => a -> TypeReps a
typeReps a = gfoldl step fcstr a
where
step :: forall d b. (Typeable d, Data d) => TypeReps (d -> b) -> d -> TypeReps b
step tot d = tot <++> typeReps d
fcstr :: forall g . g -> TypeReps g
fcstr g = TypeReps [typeOf a]
그러나 이것이
TypeRep
유형을 복제하는 것처럼 보입니다.
s 결과 :
>>> typeReps ['a']
TypeReps {getTypes = [[Char],Char,[Char]]}
또한, 나는
g
를 사용하지 않는 것이 약간 뒤로 보입니다.
그러나
a
fsctr
에서
위의 기능 (그리고
g
를 제한 할 수 없기 때문에 나는 할 수 없다
와이즈 비즈
).
이것이 이런 식으로 해결할 수 있는지 모르겠습니다. 그렇지 않다면 다른 방법이 있는지 궁금합니다.
Typeable
- 답변 # 1
- 답변 # 2
도움을 주셔서 감사합니다! 누군가
Generics
를 사용 하여이 문제를 해결하는 데 관심이있는 경우 이 메커니즘으로 찾은 솔루션은 다음과 같습니다.class Typeable a => HasTypeReps a where typeReps :: a -> [TypeRep] default typeReps :: (Generic a, GHasTypeReps (Rep a)) => a -> [TypeRep] typeReps a = typeOf a: gTypeReps (from a) class GHasTypeReps f where gTypeReps :: f a -> [TypeRep] instance GHasTypeReps U1 where gTypeReps U1 = [] instance (GHasTypeReps a, GHasTypeReps b) => GHasTypeReps (a :*: b) where gTypeReps (a :*: b) = gTypeReps a ++ gTypeReps b instance (GHasTypeReps a, GHasTypeReps b) => GHasTypeReps (a :+: b) where gTypeReps (L1 a) = gTypeReps a gTypeReps (R1 b) = gTypeReps b -- | We do need to do anything for the metadata. instance (GHasTypeReps a) => GHasTypeReps (M1 i c a) where gTypeReps (M1 x) = gTypeReps x -- | And the only interesting case, get the type of a type constructor instance (HasTypeReps a) => GHasTypeReps (K1 i a) where gTypeReps (K1 x) = typeReps x instance HasTypeReps a => HasTypeReps [a] where typeReps xs = typeOf xs: concatMap typeReps xs instance (HasTypeReps a, HasTypeReps b) => HasTypeReps (a, b) where typeReps [email protected](a, b) = typeOf t: (typeReps a ++ typeReps b) instance HasTypeReps Char where typeReps x = [typeOf x] instance HasTypeReps Int where typeReps x = [typeOf x]
다른 답변에서 지적했듯이 Li-yao는 특별한 방법으로 목록을 처리하고 몇 가지 다른 인스턴스를 정의하여 보일러 플레이트를 추가해야합니다.
예 :
>>> typeReps ['a'] [[Char],Char] >>> :set -XDeriveGeneric >>> data Foo = Foo [Int] (Char, Char) deriving (Generic) >>> instance HasTypeReps Foo >>> typeReps $ Foo [1, 2] ('a', 'b') [Foo,[Int],Int,Int,(Char,Char),Char,Char]
관련 자료
- javascript - JQuery를 사용하여 동적으로 colspan 값 설정
- python - 인덱스 및 슬라이싱을 사용하지 않고 중첩 목록의 값에 액세스하는 방법은 무엇입니까?
- javascript - FOREACH를 사용하여 json 배열의 최소값을 어떻게 얻을 수 있습니까?
- javascript - 지정된 값을 사용하여 테이블에서 td를 색칠하는 방법은 무엇입니까?
- 아카이브 된 파일의 json에서 특정 값을 읽는 방법 javascript 및 jszip 사용
- REGEX 패턴을 기반으로 Jenkins 파이프 라인에서 Groovy를 사용하여 값을 설정합니다
- swift - UISlider를 사용하는 시작 값 문제
- mysql - 행 현명한 연산을 사용하여 설정된 SQL 열 기본값
- javascript - 사용자 입력을 사용하여 json 값 표시
- jquery - ckeditor, Ajax를 사용하여 텍스트 영역의 값 얻기
- python - if 문을 사용하여 함수를 호출 한 다음 if 문 안에 반환 된 값을 인쇄하려면 어떻게해야합니까?
- javascript - URLSearchParams를 사용하여 동일한 키로 여러 키 값 쌍 중 하나만 제거하는 방법은 무엇입니까?
- Java를 사용하여 JSON 값을 업데이트하는 방법
- python 3.x - BeautifulSoup을 사용하여 옵션 값을 얻는 방법은 무엇입니까?
- python - 셀레늄을 사용하여 ID, 값 및 유형이없는 요소 (버튼)를 찾는 방법은 무엇입니까?
- typescript - 일반 매개 변수에 기본값을 제공하는 방법은 무엇입니까?
- object - 상태 구성 요소를 사용하는 ReactJS 설정 값 정의되지 않음
- bash 스크립트를 사용하여 xml 파일에서 특정 값 가져 오기
- 자바 스크립트를 사용하여 클릭했을 때 를 사용하여 URL에 값을 추가하는 방법
- javascript - 각각을 사용하여 선택된 확인란 값을 배열로 푸시
트렌드
- OpenCv의 폴더에서 여러 이미지 읽기 (python)
- 파이썬 셀레늄 모든 "href"속성 가져 오기
- html - 자바 스크립트 - 클릭 후 변경 버튼 텍스트 변경
- javascript - 현재 URL에서 특정 div 만 새로 고침/새로 고침
- JSP에 대한 클래스를 컴파일 할 수 없습니다
- JavaScript 변수를 HTML div에 '출력'하는 방법
- git commit - 자식 - 로컬 커밋 된 파일에 대한 변경을 취소하는 방법
- jquery - JavaScript로 현재 세션 값을 얻으시겠습니까?
- javascript - swiperjs에서 정지, 재생 버튼 추가
- python - 화면에서 찾은 요소를 찾을 수없는 경우 셀레늄
의견에서 제안한 것처럼
[1,2,3]
를 고려하지 않은 것 같습니다. 실제로1 : 2 : 3 : []
입니다 (여기서각꼬리 하위 용어에는[Int]
유형이 있습니다. ). 목록에 특별한 경우를 추가 할 수 있습니다.시도해보십시오 :