J'essaye d'implémenter une fonction qui place habituellement le premier élément d'une liste dans une monade, mais si la monade est une liste, elle renvoie la liste entière:Fonction Haskell qui agit différemment selon le type de monade
putInMonad :: MonadPlus m => [a] -> m a
putInMonad (s:sx) = return s
putInMonad _ = mzero
putInMonad [1,2,3] :: Maybe Int
devrait revenir Just 1
et
putInMonad [1,2,3] :: [] Int
devrait revenir [1,2,3]
.
Des idées?
Vous pouvez utiliser '[[]] Int' comme monade inférieure. –
@WillemVanOnsem Non, car l'expression 'return s' ne contient aucune information sur' sx'; Le simple fait de fournir un type de retour concret n'aide pas. – chepner
@chepner: ouais je sais qu'il ne se comportera pas différemment pour cette monade spécifique. J'ai seulement eu l'idée de résoudre le problème de l'autre côté: donnez-lui une liste de listes au lieu d'une liste d'éléments. –