Я пытаюсь найти решение в порядке осуществления моей, с учетом следующих требований:Как карта (либо String (а -> б)) к (или String [(а -> б)])
- Нам нужно переместить объект против данной последовательности.
- Последовательность состоит из действий.
Вот возможные действия: F, L, R
- F: двигаться вперед
- L: поворот на 90 ° влево
- R: поворот на 90 ° вправо
последовательность затем представляется строкой, например:
"FFLRLFF"
Я хочу, чтобы разобрать вышеуказанную последовательность (и обработка ошибок), а затем связать каждое действие на функцию, например:
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
Теперь то, что я хочу что-то со следующей подписью:
parseSequence :: String -> Either String [(a -> a)]
Я хочу разобрать полную последовательность, используя много раз parseAction
, и не работает, когда тот возвращается влево. Я зациклился на том, как я могу реализовать эту функцию.
Есть ли у вас идеи?
Я собирался предложить Hoogle, но мне было на удивление трудно заставить Hoogle дать мне правильный ответ. Я начал с '(Char -> Либо String (a -> a)) -> (String -> Либо String [(a -> a)]), но это дало результаты; получение правильного ответа требовало как понимания того, что я мог бы заменить «a -> a» более полиморфным «a», и что я мог бы заменить «Либо» строкой более полиморфной «f». Только тогда он предложил «mapM». Ну, по крайней мере, мне не нужно было понимать, что «Char» и «String» могут быть заменены более-полиморфными 'b' и' [b] '. –
Не 'id' единственные допустимые функции типа' a -> a'? (Игнорирование ошибок, неопределенных, небезопасных побочных эффектов и т. Д.) – immibis