J'essaye d'obtenir le code ci-dessous fonctionnant. C'est une machine à états finis où je passe dans une fonction-comme-état-suivant. La fonction est appelée avec r
et renvoie une liste de résultats + le prochain état de fonction-comme-suivant. Continuez à appeler jusqu'à épuisement de la liste et renvoyez la concaténation des résultats. La monade est une monade d'erreur pour me permettre de lancer une erreur si nécessaire.Haskell Infinite Type
fsm f [] = return []
fsm f (r:rs) = do
(xs, f') <- f r
rest <- fsm f' rs
return $ xs ++ rest
L'erreur est:
Occurs check: cannot construct the infinite type: t1 = t0 -> m0 ([a0], t1)
In the first argument of `fsm', namely f'
Je l'ai vu l'erreur de type infini avant et je comprends la manière autour d'elle est d'envelopper un type avec un newtype
. Mais je ne peux pas comprendre comment faire cela.
Quelqu'un peut-il souligner le point de vue?
Quel est le type de 'f'? Pouvez-vous l'écrire? – Ingo
Ce serait 'f :: String -> m ([String], t)' où 't' serait le type de' f'. Je comprends c'est pourquoi c'est un type infini, mais ne peut pas comprendre comment l'envelopper correctement. – me2