Одним из способов является исчерпывающее описание дел:
charFromEscape :: Char -> Char
charFromEscape 'n' = '\n'
charFromEscape 't' = '\t'
--- ... --- Help!
Вы также можете использовать lookup
:
-- this import goes at the top of your source file
import Data.Maybe (fromJust)
charFromEscape :: Char -> Char
charFromEscape c = fromJust $ lookup c escapes
where escapes = [('n', '\n'), ('t', '\t')] -- and so on
fromJust
бит может выглядеть странно.Тип lookup
равен
lookup :: (Eq a) => a -> [(a, b)] -> Maybe b
, что означает, что для значения некоторого типа, для которого определено равенство, и для таблицы поиска, он хочет дать вам соответствующее значение из таблицы поиска - но ваш ключне гарантируется присутствие в таблице!Это цель Maybe
, определение которого
data Maybe a = Just a | Nothing
С fromJust
предполагается, что вы получили Just something
( т.е. , c
имеет запись в escapes
), но это развалится, когда это предположение будет недействительным:
ghci> charFromEscape 'r'
*** Exception: Maybe.fromJust: Nothing
Эти примеры помогут вам выполнить упражнение, но ясно, что вам нужна лучшая обработка ошибок.Кроме того, если вы ожидаете, что таблица поиска будет большой, вы можете посмотреть на Data.Map .