홈>
하스켈 타입을이 식으로 만드는 방법이 있습니까?
ls = [4, 3.2, True, "home"]
친구가 내게 준 도전이지만, 어떤 아이디어도 나오지 않으며, 그것이 가능한지 말해주지 않았기 때문에 귀중한 시간을 낭비하고있을 것입니다.
- 답변 # 1
- 답변 # 2
만약 목록에있는 모든 것을 인쇄하려면 ExistentialQuantification을 사용하여 유형이
Show
를 넘어서는 것이 아니라는 사실을 "숨길"수 있습니다 인스턴스 (또는 관심있는 인스턴스)다음은 간단한 예입니다 (언어 확장에 주목하십시오-다른 컴파일러에 대해서는 잘 모르지만 GHC에서 작동한다는 것을 알고 있습니다) :
{-# LANGUAGE ExistentialQuantification #-} data Obj = forall a. (Show a) => Obj a ls :: [Obj] ls = [Obj 4, Obj 3.2, Obj True, Obj "home"] printObj :: Obj -> IO () printObj (Obj x) = putStrLn (show x) main = mapM printObj ls
귀하의 목록이 귀하의 질문과 완전히 동일하지는 않지만
Obj
Show
가있는 모든 유형을 취할 수 있습니다 예를 들어 - 답변 # 3
여기서 충분히 가까운 흥미로운 것을 발견했습니다
data Showable a = forall a. Show a => MkShowable a pack :: Show a => a -> Showable pack = MkShowable hlist :: [Showable] hlist = [ pack 3 , pack "house" , pack True , pack 'y' , pack (Just Nothing) ] res = map (\(MkShowable v) -> show v) hlist
관련 질문
- Haskell | 유형 선언 및 약어를 이해하는 데 어려움을 겪습니다.
- haskell - 다른 데이터 유형의 생성자가 하나 뿐인 데이터 유형을 가질 수 있습니까?
- scala - 함수형 프로그래밍 언어에서 형식 생성자를 형식으로 간주 할 수 있습니까?
- haskell - 이 함수의 유형을 어떻게 파생합니까?
- types - $하스켈 부분 함수 응용 프로그램
- haskell - 단일 생성자가있는 GADT
- haskell - 이 기능의 서명을 더 정확하게 만드는 방법
- types - 데이터의 Subst에 대한 Haskell의 프린터
- haskell - 잘못된 유형을 사용한다고 알려주는이 유형 클래스 오류를 이해하는 방법은 무엇입니까?
- haskell - ghci는 유형 변수의 이름을 어떻게 선택합니까?
농담으로 다음과 같이 할 수 있습니다 :
그러나 이것은 말이되지 않습니다.
<시간>표현의 형식이 기본이 아닌 경우 주석에 기록 된대로
ExistentialType
를 사용할 수 있습니다. . 그러나 그렇게하는 많은 변형이 있습니다. 사용Data.Dynamic
사용자 정의 존재 유형으로.예 :
Data.Dynamic
:맞춤형 :
유형 세트가 닫히면 ADT를 사용할 수 있습니다 :
따라서 올바른 솔루션을 선택하려면 문제에 대해 더 알아야합니다.