Supposons, par exemple, nous avons la structure de données suivantes:'pattern matching' sur les types typable
data Foo = Bool Bool | Int Int | Double Double
Maintenant, est-il un moyen plus facile de le faire:
foo :: Typeable a => a -> Foo
foo x = maybe (error "i dunno") id $
liftM Bool (cast x) `mplus`
liftM Int (cast x) `mplus`
liftM Double (cast x)
Quelqu'un at-il pensé de faire une syntaxe pour la correspondance de modèle sur Types typables?
Je pense que cela est une bonne approche. Un point mineur est que typeOf "str" ne fonctionnera pas bien en présence de OverloadedStrings, ce qui est devenu plus commun ces jours-ci. –
Il existe un problème similaire avec les littéraux numériques. Il ne s'adapte pas non plus aux situations où vous n'avez pas de constructeur pour le type de données/ils ne sont pas purs. Vous finiriez avec '(undefined :: Foo)' avant trop longtemps, ce qui est moche. Pour cette raison, je n'aime pas cette solution. – Tener
Typecase devrait être un peu minable. Cela nous rappelle de retourner à la programmation avec de vrais types et d'arrêter de jouer avec toute cette dureté d'exécution. – sclv