유형 정보/다운 캐스트를 다형 값으로 지우는 방법은 haskell에 있습니까?RankN 유형 및 패턴 일치
이 예제에서는 Int 또는 Char 중 하나를 포함 할 수있는 박스형 T가 있습니다. 그리고 어떤 형식인지 모른 채이 값을 추출하는 함수를 작성하고 싶습니다.
{#- LANGUAGE RankNTypes -#}
data T = I Int | C Char
-- This is not working because GHC cannot bind "a"
-- with specific type Int and Char at the same time.
-- I just want a polymorphic value back ;(
getValue :: T -> (forall a. a)
getValue (I val) = val
getValue (C val) = val
-- This on the other hand works, because the function
-- is local to the pattern matching expression
onValue :: T -> (forall a. a -> a) -> T
onValue (I val) f = I $ f val
onValue (C val) f = C $ f val
마지막에 유형을 입력하지 않고이 값을 추출 할 수있는 함수를 작성하는 방법이 있습니까?
첫 번째 것과 같은 getValue 함수?
충분히 명확하지 않은 경우 알려주십시오.
답변 그래서 질문 AndrewC으로 바보 (주석에서)와 YellPika는 지적했다. 무한 유형은 의미가 없습니다.
J. Abrahamson은 내가 찾고있는 것에 대한 설명을 제공하므로 해결책으로 해결책을 제시합니다.
P .: 나는 매번 새로운 유형을 원하지 않으므로 GADT를 사용하고 싶지 않습니다.
'getValue'는 * any * a를 제공 할 수 없습니다. 단지'Char' 또는'Int' –
그래, 나도 알아,하지만이 정보를 잃고 싶다. 그냥 값으로 사용하십시오. –
컴파일러가 유형을 추론 할 수없는 값으로 무엇을 하시겠습니까? 진실로 데이터가 어떤 타입인지 신경 쓰지 않는다면, 그 값을 다룰 수있는 다형 함수를 작성하고 그것을 통해 'T'타입의 데이터를 실행하십시오. 다형 함수는 형식에 의존하지 않는 방법입니다. – AndrewC