cerco di trovare una soluzione su un esercizio di mio, con i seguenti requisiti:Come mappare (O String (a -> b)) a (O String [(a -> b)])
- Abbiamo bisogno di spostare un oggetto contro una determinata sequenza.
- Una sequenza è composta da azioni.
Qui sono possibili azioni: F, L, R
- F: spostare in avanti
- L: ruotare di 90 ° a sinistra
- R: ruotare di 90 ° a destra
una sequenza è quindi rappresentato da una stringa, come questo:
"FFLRLFF"
voglio analizzare la sequenza sopra (e gestire gli errori) e quindi associare ogni azione a una funzione, come questo:
parseAction :: Char -> Either String (a -> a)
parseAction 'F' = Right moveForward
parseAction 'L' = Right turnLeft
parseAction 'R' = Right turnRight
parseAction s = Left ("Unkown action : " ++ [s])
-- Implementation omitted
moveForward :: a -> a
turnLeft :: a -> a
turnRight :: a -> a
Ora quello che voglio è qualcosa con la seguente firma:
parseSequence :: String -> Either String [(a -> a)]
Voglio analizzare una sequenza completa utilizzando più volte la funzione parseAction
e non riesce quando restituisce A sinistra. Sono bloccato su come posso implementare questa funzione.
Avete qualche idea?
Stavo per suggerire Hoogle, ma ho trovato sorprendentemente difficile convincere Hoogle a darmi la risposta giusta. Ho iniziato con '(Char -> Either String (a -> a)) -> (String -> Either String [(a -> a)])', ma che ha dato risultati; ottenere la risposta giusta richiedeva sia l'intuizione che potevo sostituire 'a -> a' con il più-polimorfico' a', e che potevo sostituire 'Either String' con il più-polimorfico' f'. Solo allora suggerì 'mapM'. Oh, beh, almeno non dovevo avere l'intuizione che 'Char' e' String' potevano essere sostituiti con il 'più polimorfico' b' e '[b]'. –
Non 'id' è l'unica funzione valida di tipo' a -> a'? (Ignorando errori, effetti collaterali non definiti, non sicuri, ecc.) – immibis