>

하스켈 타입을이 식으로 만드는 방법이 있습니까?

ls  = [4, 3.2, True, "home"]

친구가 내게 준 도전이지만, 어떤 아이디어도 나오지 않으며, 그것이 가능한지 말해주지 않았기 때문에 귀중한 시간을 낭비하고있을 것입니다.


  • 답변 # 1

    농담으로 다음과 같이 할 수 있습니다 :

    {-# LANGUAGE OverloadedStrings #-}
    import Data.String                                                          
    instance Num Bool where                                                     
        fromInteger 0 = False
        fromInteger _ = True
    instance Fractional Bool where
        fromRational 0 = False
        fromRational _ = True
    instance IsString Bool where
        fromString "" = False
        fromString _  = True
    ls = [4, 3.2, True, "home"]
    
    

    그러나 이것은 말이되지 않습니다.

    <시간>

    표현의 형식이 기본이 아닌 경우 주석에 기록 된대로 ExistentialType 를 사용할 수 있습니다. . 그러나 그렇게하는 많은 변형이 있습니다. 사용 Data.Dynamic  사용자 정의 존재 유형으로.

    예 : Data.Dynamic :

    import Data.Dynamic
    ls = [toDyn (4 :: Int), toDyn (3.2 :: Double), toDyn True, toDyn "hello"]
    
    

    맞춤형 :

    {-# LANGUAGE ExistentialQuantification #-}
     data Any = forall a. {- here can be restrictions on `a` => -} Any a
     ls :: [Any]
     ls = [Any (4 :: Int), Any (3.2 :: Double), Any True, Any "home"]
    
    

    유형 세트가 닫히면 ADT를 사용할 수 있습니다 :

    data Variant = I Int | D Double | B Bool | S String
     ls :: [Variant]
     ls = [I 4, D 3.2, B true, S "home"]
    
    

    따라서 올바른 솔루션을 선택하려면 문제에 대해 더 알아야합니다.

  • 답변 # 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
    
    

  • 이전 ggplot2 - r - 특수 문자가있는 변수 이름 참조
  • 다음 openmdao - 컨버전스 검증주기 GS