2017-11-02 14 views
0

haskellにこの式を入力させる方法はありますか?Haskell、 "マルチタイプ"リストを作成

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

それは友人が私にgived挑戦だが、何のアイデアは、それが可能な場合も教えていなかったので、多分私は貴重な時間を無駄にしています、周りに来ません。冗談として

+1

タイプは完全に任意十分に近いされていることを何か面白いものを見つけましたか? – Carcigenicate

+1

その式は正確ではありませんが、https://wiki.haskell.org/Existential_typeでリスト内の任意の型を使用できますが、リストに入った後にこれらの値を処理するのは非常に限られています。実行時ではなくコンパイル時です - これは一般に反パターンとみなされます。 –

+1

このようなリストはどのような用途に使用されますか?後でそれをどうしますか?この質問に対する答えは、それを行う方法を決定します。 –

答えて

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と:

{-# 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"] 

ので、へのカスタムタイプでは

import Data.Dynamic 

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

適切な解決方法を選択することで、あなたの問題についてもっと知る必要があります。

1

リストのすべてを印刷したい場合は、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インスタンスを持つ任意のタイプを取ることができます。

+0

ちょっと私はまったく同じと思っていた!私はそれが最も正しいかもしれないと思う、今のところ、私はそれを受け入れるだろう –

0

私は多分、それが含まれているhere

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 
関連する問題