haskellにこの式を入力させる方法はありますか?Haskell、 "マルチタイプ"リストを作成
ls = [4, 3.2, True, "home"]
それは友人が私にgived挑戦だが、何のアイデアは、それが可能な場合も教えていなかったので、多分私は貴重な時間を無駄にしています、周りに来ません。冗談として
haskellにこの式を入力させる方法はありますか?Haskell、 "マルチタイプ"リストを作成
ls = [4, 3.2, True, "home"]
それは友人が私にgived挑戦だが、何のアイデアは、それが可能な場合も教えていなかったので、多分私は貴重な時間を無駄にしています、周りに来ません。冗談として
、あなたは次のように行うことができます。
{-# 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"]
適切な解決方法を選択することで、あなたの問題についてもっと知る必要があります。
リストのすべてを印刷したい場合は、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
インスタンスを持つ任意のタイプを取ることができます。
ちょっと私はまったく同じと思っていた!私はそれが最も正しいかもしれないと思う、今のところ、私はそれを受け入れるだろう –
私は多分、それが含まれている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
タイプは完全に任意十分に近いされていることを何か面白いものを見つけましたか? – Carcigenicate
その式は正確ではありませんが、https://wiki.haskell.org/Existential_typeでリスト内の任意の型を使用できますが、リストに入った後にこれらの値を処理するのは非常に限られています。実行時ではなくコンパイル時です - これは一般に反パターンとみなされます。 –
このようなリストはどのような用途に使用されますか?後でそれをどうしますか?この質問に対する答えは、それを行う方法を決定します。 –