數據Foo a
的定義如下:函數到多態數據類型
data Foo a where
Foo :: (Typeable a, Show a) => a -> Foo a
-- perhaps more constructors
instance Show a => Show (Foo a) where
show (Foo a) = show a
一些實例:
fiveFoo :: Foo Int
fiveFoo = Foo 5
falseFoo :: Foo Bool
falseFoo = Foo False
如何可以限定從b -> Foo a
任何函數,例如:
getFoo :: (Show a, Typeable a) => String -> Foo a
getFoo "five" = fiveFoo
getFoo "false" = falseFoo
這裏getFoo
不打字檢查Couldn't match type ‘a’ with ‘Bool’
。
,我在這裏很感興趣的唯一的事情是a
是Show
類的,所以我可以用getFoo
,如:
main = getLine >>= (print . getFoo)
我喜歡這個,但我想知道OP是否真的需要它 - 很容易陷入[existential antipattern](https://lukepalmer.wordpress.com/2010/01/24/haskell-antipattern-existential-typeclass/)。但只有OP知道。 – chi
@chi是這是存在的thingy,但我不認爲這是一個反模式。我知道我在這裏是少數。 –
我們在這裏做過'Foo'這個工會類型嗎?這相當於數據Foo = IFoo Int | BFoo Bool'? – homam